2012-02-02 49 views
2

我使用德爾福XE的TADOConnection對象「而執行異步無法執行操作」,但這似乎是一個ADO的問題,不是一個Delphi問題:工作圍繞ADO錯誤3711:

方案:我想關閉並釋放連接到Sybase的TADOConnection對象。在向Sybase發送長時間運行的查詢後,連接正在等待來自遠程Sybase服務器的響應 - 在此期間,用戶認爲響應過程耗時過長,並希望中止該過程。

問題:當試圖關閉或釋放時,它正在等待的Sybase響應的ADOConnection對象,我收到此錯誤信息:

「操作不能同時執行異步執行」,和我呼叫關閉/自由失敗。所以,當中止這個過程時,我最終會遇到泄漏和孤兒連接 - 而不是我的情況下的世界末日,但也不是最理想的。

此消息對應於 ADO錯誤3711-adErrStillExecuting - 在異步執行時無法執行操作。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681549%28v=vs.85%29.aspx

問:我怎樣才能改變的ADOConnection對象,使其不再等待的Sybase響應,這應該允許我這樣稱呼TADOConnection.close和TADOConnection的狀態。自由。

我可以通過Delphi TADOConnection包裝訪問ADOConnection本身,所以我可以使用ADO TLB中的任何可用來完成此操作。

注 - 我沒有明確指示ADO執行異步操作 - 我假設這是我正在運行的上下文(線程在TISAPI應用程序響應中產生)的默認值。無論如何,我認爲如果ADO呼叫被阻止,則中止會更加困難。

+0

是否有一個原因,你不能有中止等待(在一個線程中)的完成,然後正常關閉? – 2012-02-02 15:59:48

+0

這裏的體系結構有點複雜 - 我只解釋了相關部分 - 當時的顯式異常終止是完成此操作的最有效方式,並且需要最少的代碼模塊。我可以按照您的建議實施協商問題的機制 - 我認爲 - 但不值得麻煩 - ISAPI應用程序和Sybase有大量資源,並且定期回收。只是尋找一個快速和骯髒的答案的問題。 – Vector 2012-02-02 16:29:48

回答

3

看看這個response

特別是DataSet.Recordset.Cancel;部分。 在關閉連接之前,您需要先取消查詢。

+1

在該響應中,它解釋了您需要取消在異步獲取期間定期觸發的'onFetchProgress'事件。這看起來很有希望,稍後會嘗試。謝謝。 – Vector 2012-02-02 18:49:13