【发布时间】:2011-11-14 05:45:27
【问题描述】:
我有一个连接到 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 语句运行后立即终止程序,然后检查数据库,新表不存在。
有谁知道是什么原因造成的,我该如何解决?
【问题讨论】:
-
我不熟悉 DBX,我使用 IBX for Firebird,所以这是一条评论:确保提交用于创建表的事务。确保您的“New_TableDataset”是使用新事务激活的,而不是使用具有不同系统表视图的长期运行事务激活的。
-
其他提示:我会将大多数 DDL 操作运行到自己的事务中,并在每个事务之后提交。事实上,某些工具中有一个选项可以“自动提交 DDL 操作”。而且我绝对不会将 DDL 与常规操作混为一谈。
-
可能使用 TSqlQuery 组件而不是已弃用的 TSimpleDataset。
-
@No'am:已弃用?在哪个版本?因为它肯定不在 Delphi XE 中,而且 TSqlQuery 不是它的合适替代品。
标签: delphi firebird delphi-xe dbexpress