我有一个连接到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
语句后立即终止程序,那么检查数据库,新表就不存在了。
任何人都知道可能导致这种情况的原因,以及我如何解决这个问题?
答案 0 :(得分:4)
SQL
,SQL2
和SQL3
正在一个(或多个)交易中执行。并且交易至少在SQL
之后保持活跃。并且New_TableDataset
在不同的交易中运作,当然没有看到第一笔交易的未经修改的变更。COMMIT
和/或SQL
之后执行SQL2
。TSQLQuery
代替ExecuteDirect
。希望所有命令都能在一次交易中运行。PS:最后考虑使用不同的dbExpress驱动程序甚至数据访问库。
答案 1 :(得分:0)
我遇到过与ADO类似的问题,解决方法是:
1 /至今说:在所有DDL SQL之后执行COMMIT。
2 /当第一个CREATE正常时,在创建的表上进行SELECT查询(+ COMMIT)