为什么CREATE TABLE似乎成功但在DBX下失败?

时间:2011-11-14 05:45:27

标签: delphi firebird delphi-xe dbexpress

我有一个连接到Firebird数据库的DBExpress连接,运行Firebird Embedded。到目前为止一切正常,但是一些非常奇怪的事情正在发生。

我有一个包含连接的数据模块和一些表示不同表的TSimpleDataset个对象。但是当我尝试添加一个新表时,它似乎可以工作,但随后失败了:

procedure Update(module: TdmDatabase);
const
   SQL = 'CREATE TABLE NEW_TABLE (blah blah blah)';
   SQL2 = 'ALTER TABLE NEW_TABLE ADD CONSTRAINT PK_NEW_TABLE PRIMARY KEY (blah)';
   SQL3 = 'DROP TABLE NEW_TABLE';
begin
   module.connection.ExecuteDirect(SQL);      //succeeds
   module.connection.ExecuteDirect(SQL2);     //succeeds
   try
     module.New_TableDataset.Active := true;  //fails
   except
     module.connection.ExecuteDirect(SQL3);   //succeeds
     raise;
   end;
end;

当我尝试创建表格时,它似乎可以正常工作,我可以ALTERDROP就好了,但是当我尝试打开运行SELECT的数据集时反对它,我得到一个“无效的表名”错误。如果我在调试器下运行它并在运行CREATE TABLE语句后立即终止程序,那么检查数据库,新表就不存在了。

任何人都知道可能导致这种情况的原因,以及我如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

  1. 这看起来像纯粹的交易问题,其中SQLSQL2SQL3正在一个(或多个)交易中执行。并且交易至少在SQL之后保持活跃。并且New_TableDataset在不同的交易中运作,当然没有看到第一笔交易的未经修改的变更。
  2. 问题不是特定于DataSnap / dbExpress,而是特定于驱动程序实现。所以,很高兴知道什么是驱动程序。并可选择联系驱动程序供应商技术支持。
  3. 怎么做(纯猜测):
    • 尝试将命令执行包围到显式事务控制中。这将(可能)保证交易在所需步骤之后完成。
    • 尝试在COMMIT和/或SQL之后执行SQL2
    • 尝试使用TSQLQuery代替ExecuteDirect。希望所有命令都能在一次交易中运行。
  4. PS:最后考虑使用不同的dbExpress驱动程序甚至数据访问库。

答案 1 :(得分:0)

我遇到过与ADO类似的问题,解决方法是:

1 /至今说:在所有DDL SQL之后执行COMMIT。

2 /当第一个CREATE正常时,在创建的表上进行SELECT查询(+ COMMIT)