2

我有一个连接到 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;

当我尝试创建表时,它似乎可以工作,而且我可以ALTER并且DROP很好,但是当我尝试打开一个SELECT针对它运行的数据集时,我收到“无效的表名”错误。如果我在调试器下运行它并在CREATE TABLE语句运行后立即终止程序,然后检查数据库,新表不存在。

有谁知道是什么原因造成的,我该如何解决?

4

2 回答 2

4
  1. 这看起来像是一个纯粹的事务问题,其中SQLSQL2正在SQL3一个(或多个)事务中执行。并且交易至少在之后仍然有效SQL。并且New_TableDataset是在不同的事务中操作,这当然不会看到第一个事务的未提交更改。
  2. 问题不是特定于 DataSnap / dbExpress,而是特定于驱动程序实现。所以,很高兴知道什么是驱动程序。并可选择联系驱动程序供应商技术支持。
  3. 怎么办(纯属猜测):
    • 尝试将命令执行包含在显式事务控制中。这将(可能)保证事务在所需步骤之后完成。
    • 尝试在和/或COMMIT之后执行。SQLSQL2
    • 尝试使用TSQLQuery而不是ExecuteDirect. 希望所有命令都将在单个事务中运行。

PS:最后考虑使用不同的dbExpress驱动甚至数据访问库。

于 2011-11-14T07:04:40.780 回答
0

我对 ADO 也有过类似的问题,解决方案是:

1/ 如前所述:在所有 DDL SQL 之后执行 COMMIT。

2/ 当第一个 CREATE OK 时,对创建的表进行 SELECT 查询(+COMMIT)

于 2011-11-14T10:22:13.047 回答