2009-02-03 60 views
3

我只使用DbExpress組件在Delphi中完成「GUI」數據庫訪問,但現在我想在後臺執行一個查詢。我讀了一些TSQLConnection不是線程安全的,我必須爲每個線程創建新的連接。我看到TSQLConnection中有CloneConnection,但是有助於聲稱新連接屬於原始連接。線程DbExpress查詢

所以,

1)什麼是執行TSQLQuery位於數據模塊線程的正確方法?

2)我可以使用TSQLConnection.CloneConnection嗎?我應該釋放克隆的連接還是在線程結束時保持不變?

簡單的示例代碼(或URL)將非常有幫助。

回答

4

這不是特定於DbExpress(我沒有經驗),但將某些功能移到後臺線程中的最佳方法是首先在主線程中開發它,調試它,一旦確定它表現良好,然後移動它。

你可以做的是把所有東西放到TDataModule上。如果數據模塊能夠獨立工作,不需要其他表單或數據模塊上的其他組件,並且您可以在後臺線程中創建它,那麼您可以確信事情將起作用。您不需要克隆連接,因爲它將在執行對數據庫的所有訪問的同一個線程中創建和銷燬。

數據庫工作的一些重要的提示與後臺線程:

  • 處理所有異常,如在輔助線程未處理的異常可以/將你的程序崩潰。 Application對象中的異常處理不適用於您。

  • 不要訪問GUI線程中的任何東西。這意味着最重要的是TDataSource不可用,並且不能使用數據敏感的控件。

  • 如果您使用的組件對SendMessage或PostMessage執行任何操作,則必須在後臺線程中創建標準的消息循環。

  • 如果您使用的組件對OLE執行任何操作,則在後臺線程的上下文中調用OleInitialize()和OleUnitialize()。

如果你想使您的生活更輕鬆,可以考慮使用任何OmniThreadLibraryAsyncCalls。哪一個取決於您的後臺數據庫連接將持續多久,以及您是否要重用它們。

+0

當前的解決方案最大的問題是我有多個相互依賴的數據模塊(連接在另一個datamodule比查詢)。但我會看看我能否改善這一點。 – Harriv 2009-02-03 12:21:00