我有一個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。 –