2010-09-10 37 views
3

我有以下代碼來執行返回多個結果集的SQL存儲過程,然後從流中讀取此結果。對於背景信息:它將xml塊作爲字符串返回,然後將其轉換爲完整的xml。 它運行良好一年,但現在我有一個情況,導致錯誤消息:操作取消。調試器顯示:項目x引發異常類EOleException,消息操作已取消。 我不知道是什麼原因導致它。任何幫助或建議都會很棒。在德爾福ADO錯誤'操作取消'

const 
    adExecuteStream = $00000400; //Indicates that the results of a command execution should be returned as a stream. 
var 
    objCmd, InputStream, XML, XSLT, Template, Processor, objConn, strmResults : Variant; 
    ATStreamClass : TMemoryStream; 
    Adapt : TStreamAdapter; 
    OutputStream: IStream; 

objCmd := CreateOLEObject('ADODB.Command'); 
objCmd.ActiveConnection := dmABaasMock.dbRaAndm.ConnectionObject; 
objCmd.CommandType := adCmdText; 
objCmd.CommandText := <sp proc name with params>; 
strmResults := CreateOLEObject('ADODB.Stream'); 
strmResults.Open; 
objCmd.Properties['Output Stream'] := strmResults; 
objCmd.Execute(EmptyParam, EmptyParam, adExecuteStream); // HERE COMES THE EXCEPTION 
strmResults.Position := 0; 
xmlMemo.text := strmResults.ReadText; 

回答

2

很難猜出發生了什麼事情而沒有看到更多。
三件事情可以做,以獲得更多的調試信息:

  • 發生了什麼之間改變,當它的工作呢?操作系統版本(或ADO),數據庫,存儲過程,...
  • 直接在SQL環境中啓動時存儲過程是否正常工作?
  • 您可以重寫代碼以使用常規的ADO組件而不是進行晚期綁定,並在DataSets中獲取結果而不是ADODB.Stream OleObject。如果需要在代碼中進行調試和向下鑽取,只有Variant對象沒有多大幫助?你不能調試黑盒...
+0

事情是,它仍然適用於其他人,它是一個用戶和數據的單一情況。我在存儲過程中遇到了很大的問題,超時,但在這種情況下,也沒有太多數據。所以,沒有什麼改變,從Management Studio執行時存儲的proc工作正常,我不得不在某些時候重寫代碼,但沒有其他任何幫助,但這仍然可以在99.99%的時間內運行。 – Tamm 2010-09-13 09:58:58

+0

@Tamm。 「一個用戶和數據的單個案例...」您可以將用戶和數據分開以查看它是否與數據或用戶(或計算機)相關聯。這將有助於瞭解它是否與此數據庫或某個用戶​​的設置相關聯。 – 2010-09-13 17:20:12

+0

所以,它沒有鏈接到用戶。我在自己的電腦上運行它,結果如下:EOleException,操作已取消。 Delphi的ComObj單元中的DispCallError過程引發了該錯誤。所以它一定是數據相關的問題?我沒有簡單的方法將數據分成更小的部分進行調查,更不可能。 – Tamm 2010-09-13 18:08:46

1

我最近有一些奇怪的錯誤信息連接到ADO時,並沒有連接字符串的權利。
我不是100%確定它是相同的錯誤信息(對不起,我忘了截圖然後),但如果是這樣,那麼這可能有所幫助:

在.NET中,當您連接到ADO並使用集成安全性,則可以指定Integrated Security="True",但使用本機提供程序(不僅在Delphi中,而且在任何本機環境中),您必須指定Integrated Security="SSPI"

我陷入了這種情況,因爲我在擺弄連接字符串(從Delphi本機win32連接到我之前連接到.NET的服務器),忘記只複製相關部分。

- jeroen

+0

感謝您的回答,連接字符串可能會令人頭疼,但這裏不能這樣。 Theres沒有連接問題,存儲過程正確執行,連接仍然工作。 – Tamm 2010-09-13 10:06:38

+0

好的;什麼是確切的異常(異常類,異常消息,異常屬性,如果它是有錯誤列表的東西)?我猜你使用SQL Server;您是否在那裏運行跟蹤,以查看錯誤是在服務器上還是在ADO端? – 2010-09-13 11:25:55

+0

我跑了一個跟蹤,錯誤不在服務器端。 EOleException,操作已取消。 Delphi的ComObj單元中的DispCallError過程引發了該錯誤。堆棧窗口中的最後一行是DispCallError(-2147352567,(0,0,'Microsoft SQL Native Client','Operation Canceled','',0,nil,nil,-2147217887),nil,False)。 – Tamm 2010-09-13 18:20:23