2011-11-14 51 views
2

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

當我試圖創建表,它似乎工作,我可以ALTERDROP它只是罰款,但是當我嘗試打開一個對其運行SELECT的數據集,我收到「無效的表名」錯誤。如果我在調試器下運行它,並在CREATE TABLE語句運行後立即終止程序,那麼檢查數據庫,新表不在那裏。

任何人都知道可能會導致什麼,以及我如何解決它?

+0

我不熟悉的DBX做一個SELECT查詢(+ COMMIT),我使用IBX的火鳥,所以這是一個註釋:確保你提交你用來創建表的事務。確保使用新事務激活了「New_TableDataset」,但未使用具有不同系統表視圖的長時間運行的事務激活它。 –

+0

其他提示:我會將大多數DDL操作運行到自己的事務中,在每個事務之後進行提交。事實上在某些工具中有一個選項來「自動提交DDL操作」。而且我絕對不會將DDL與常規操作混合使用。 –

+0

也許使用TSqlQuery組件而不是已棄用的TSimpleDataset。 –

回答

4
  1. 這看起來像一個純粹的交易問題,其中SQLSQL2SQL3在一個(或多個)事務正在執行。至少在SQL之後交易仍然有效。並且正在不同的交易中操作,當然這並不會看到第一筆交易的未被改變的變化。
  2. 該問題不是DataSnap/dbExpress特定的,而是驅動程序實現特定的。所以,很高興知道驅動程序是什麼。並可以選擇聯繫驅動程序供應商技術支持。
  3. 怎麼辦(純粹推測):
    • 嘗試將命令執行包圍爲明確的事務控制。這將(可能)保證,交易在需要的步驟後完成。
    • 嘗試在SQL和/或SQL2之後執行COMMIT。請使用TSQLQuery而不是ExecuteDirect。希望所有命令都可以在單個事務中運行。

PS:最後考慮使用不同的dbExpress驅動程序,甚至數據訪問庫。

+0

謝謝。將CREATE TABLE放入自己的顯式事務中。 –

0

我曾與ADO類似的問題,解決辦法是:

1 /作爲又說道:執行所有DDL SQL後提交。

2 /當第一個CREATE是確定的,在創建表

+1

除非這是一個驅動程序問題,否則建議「2」是無用的。如果司機不好,應該更換。至於「1」,應該增加指定COMMIT應該遵循DDL(數據定義語言)語句 - 因爲它看起來像COMMIT應該遵循所有的SQL語句,這是明顯錯誤的,因爲它破壞了整個概念使用事務,以便多個操作成功或失敗。 –

+0

@CosminPrund我知道2 /似乎沒用,但在我的情況下它是有效的,有時驅動程序不能被輕鬆替換,等等:它很容易測試。我對你的1 /評論還可以:我會編輯我的帖子。 – philnext

相關問題