我有一个DBExpress连接连接到Firebird数据库,运行Firebird Embedded。目前为止一切正常,但有些奇怪的事情正在发生。为什么CREATE TABLE显示成功,但在DBX下失败?
我有一个数据模块,其中包含连接和一些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做一个SELECT查询(+ COMMIT),我使用IBX的火鸟,所以这是一个注释:确保你提交你用来创建表的事务。确保使用新事务激活了“New_TableDataset”,但未使用具有不同系统表视图的长时间运行的事务激活它。 –
其他提示:我会将大多数DDL操作运行到自己的事务中,在每个事务之后进行提交。事实上在某些工具中有一个选项来“自动提交DDL操作”。而且我绝对不会将DDL与常规操作混合使用。 –
也许使用TSqlQuery组件而不是已弃用的TSimpleDataset。 –