2017-03-01 3 views
1

Ich versuche, die CreateTable() - Methode der TFDTable-Klasse von FireDAC zu verwenden, um eine Tabelle auf meinem MySQL-Server zu erstellen.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(); 
    } 
} 

Sobald ich die Methode Create es einen Fehler wirft nennen, dass die Tabelle xxxx.Setting existiert nicht:

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

So weit so gut: Diese Fehlermeldung ist korrekt - aber die eigentliche Spaß daran ist, dass die Tabelle erfolgreich erstellt wurde und der Code eingefügt wurde.

Dies geschieht auch mit SQLite anstelle von MySQL.

Ich verwende Embarcadero C++ Builder XE10 Seattle.

Wie soll ich das richtig behandeln? Gibt es eine Möglichkeit, diese ziemlich nutzlose Fehlermeldung zu unterdrücken?

Edit: Es stellte sich heraus, dass EMySQLNativeException nur ausgelöst wird, wenn der Debugger läuft. Also habe ich einfach auf das Kontrollkästchen geklickt, um diese Ausnahmen zu ignorieren und alles ist gut.

Erstellen von Datenbanken mit TFDTable und CreateTable() funktioniert wie Charme. Leider ist es einfach undokumentiert (wie fast alles bei Borland/CodeGear/Embarcadero) ...

Antwort

0

Diese Ausnahme wird von der FireDAC-Engine ausgelöst und wird durch einen Versuch verursacht, eine Tabelle ohne Überprüfung zu erstellen, wenn sie bereits existiert. Es wird intern behandelt und die Engine funktioniert ordnungsgemäß. Sie sehen also eine Debugger-Ausnahmebedingungsnachricht. Wenn Sie die CreateTable Methode mit dem Erholungs Parameter aufgerufen aktiviert:

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

die Tabelle zuerst gelöscht werden würde und Sie würden die erwähnte Ausnahme aus diesem Grunde nicht bekommen.

Verwandte Themen