2017-03-01 6 views
1

FireDAC의 TFDTable 클래스의 CreateTable() 메소드를 사용하여 MySQL 서버에 테이블을 생성하려고합니다. 즉시 나는 그것이 테이블 xxxx.Setting이 존재하지 않는 오류 던지는 CreateTable에서 메서드를 호출로FireDAC TFDTable CreateTable

void __fastcall TFormMain::ButtonCreateTableClick(TObject *Sender) 
{ 
    TFDTable *Table = new TFDTable(this); 

    try 
    { 
     Table->Connection = FDConnection; 
     Table->TableName = "Setting"; 
     Table->Exclusive = true; 

     //Table->FieldDefs->Add("SettingCode", ftString, 99); 
     //Table->FieldDefs->Add("SettingValue", ftString, 255); 

     TField *Field; 

     Field = new TStringField(this); 
     Field->Name = "FieldSettingCode"; 
     Field->FieldName = "SettingCode"; 
     Field->Size = 100; 
     Field->DataSet = Table; 

     Field = new TStringField(this); 
     Field->Name = "FieldSettingValue"; 
     Field->FieldName = "SettingValue"; 
     Field->Size = 255; 
     Field->DataSet = Table; 

     // Fires "Table 'Setting' doesn't exist" error 
     Table->CreateTable(false, TFDPhysCreateTableParts() << tpTable << tpPrimaryKey << tpIndexes); 
     Table->Open(); 

     Table->Insert(); 
     Table->FieldByName("SettingCode")->Value = "test2"; 
     Table->FieldByName("SettingValue")->Value = "testValue2"; 
     Table->Post(); 

     // Table->CreateDataSet(); 
    } 
    __finally 
    { 
     Table->Free(); 
    } 
} 

:

Im Projekt DBCreator.exe ist eine Exception der Klasse EMySQLNativeException mit der Meldung '[FireDAC][Phys][MySQL] Table 'setting' already exists' aufgetreten. 

를 지금까지 너무 좋아 :이 오류 메시지가 정확한지 -하지만 실제 재미있는 사실은 테이블이 성공적으로 생성되었고 코드가 삽입되었다는 것입니다.

이것은 MySQL 대신 SQLite를 사용하는 경우에도 발생합니다.

저는 Embarcadero C++ Builder XE10 Seattle을 사용하고 있습니다.

어떻게해야합니까? 이 쓸데없는 오류 메시지를 억제하는 방법이 있습니까?

편집 : 디버거가 실행 중일 때만 EMySQLNativeException이 발생합니다. 그래서 방금 이러한 예외를 무시하는 확인란을 클릭하고 모든 것이 좋습니다.

TFDTable 및 CreateTable()을 사용하여 데이터베이스를 만드는 작업은 charm과 유사합니다. 불행히도 이것은 단지 문서화되지 않은 것입니다. (거의 모든것이 @Boldland/CodeGear/Embarcadero와 같습니다) ...

답변

0

이 예외는 FireDAC 엔진에 의해 발생되며 이미 존재하는지 확인하지 않고 테이블을 만들려고 시도했을 때 발생합니다. 내부적으로 처리되고 엔진이 제대로 작동하므로 디버거 예외 메시지가 표시됩니다. 당신이 사용할 수 레크리에이션 매개 변수와 함께 CreateTable 방법이라고하는 경우 :

Table->CreateTable(True, TFDPhysCreateTableParts() << tpTable << tpPrimaryKey << tpIndexes); 

테이블이 먼저 삭제 될 것이며,이 이유에 대해 언급 한 예외가 발생하지 않을 것입니다.