FireDAC TFDTable CreateTable

时间:2017-03-01 11:01:01

标签: c++builder firedac

我正在尝试使用FireDAC的TFDTable类的CreateTable()方法在我的MySQL服务器上创建一个表。

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();
    }
}

只要我调用CreateTable方法,它就会抛出表xxxx.Setting不存在的错误:

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

到目前为止一直这么好:这个错误信息是正确的 - 但真正有趣的事实是,表已经成功创建并且代码已经插入。

使用SQLite而不是MySQL也会发生这种情况。

我正在使用Embarcadero C ++ Builder XE10 Seattle。

我该如何正确处理? 有没有办法压制这个相当无用的错误信息?

修改 事实证明,只有在调试器运行时才会抛出EMySQLNativeException。所以我只是单击复选框忽略这些异常,一切都很好。

使用TFDTable和CreateTable()创建数据库就像魅力一样。不幸的是它根本没有记录(就像几乎所有的东西@ Borland / CodeGear / Embarcadero)......

1 个答案:

答案 0 :(得分:0)

FireDAC引擎抛出该异常,这是由于尝试创建表而不检查是否已存在而引起的。它在内部处理并且引擎正常运行,因此您看到的是调试器异常消息。如果您在启用了重新创建参数的情况下调用了CreateTable方法:

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

该表将首先被删除,因此您不会得到提到的异常。