2013-03-25 46 views
1

我有一塊非常大的SQL塊,我試圖在Delphi內部針對Microsoft SQL數據庫執行。我得到這個:通過TADOQuery執行的複雜T-SQL腳本觸發「多步OLE DB操作生成錯誤」。

Multiple-step OLE DB operation generated errors. 
    Check each OLE DB status value, if available. No work was done. 

腳本有多個SQL語句IF之後BEGINEND塊用的存儲過程,變量聲明,EXEC內部的調用。最後它返回SELECT @Variable1 AsName1,@Variable2 AsName2...的一些變量值。

上面的多步錯誤是從ADO中而不是從Delphi代碼中引入的,並且在所有SQL exec存儲過程發生之後發生,因此我懷疑它在它發生這個OLE異常時觸發到達最後階段SELECT @Variable1 AsName1,...爲我的程序找回幾個變量值來查看它們。

我知道這個退休/棄用MS KB文章,這是不幸的是沒有我的實際問題:

http://support.microsoft.com/kb/269495 

總之是KB文章說,以修復註冊表項,並刪除「持續安全信息」,從連接字符串。這不是我的問題。我問這個問題是因爲我已經找到了答案,而且我認爲在這裏遇到困難的其他人可能不想浪費幾個小時來查找潛在問題,因爲在查找解決方案几個小時後發現了幾個問題。任何想用不同選項添加另一個答案的人都沒問題,如果可以重現,我會選擇你的答案,如果有必要,我會把這個答案變成一個社區Wiki,因爲這個「ADO記錄集可能有十幾個不明確的原因心情不好,對你的T-SQL「異常不滿意。

回答

2

我發現了各種文檔資源中列出的幾個潛在原因。問題中的原始知識庫文章建議從我的ADO連接字符串中刪除「Persist Security Info」,但是,在僅使用TADOConnection和單個TADOQuery的應用程序的獨立測試中,Persist Security Info的存在與否不起作用,也沒有明確地將其設置爲True或False。

什麼解決它刪除此CursorType聲明:

CursorType=ctKeyset

我學到的是,雙向ADO數據集都很好,在ADO SELECT * FROM TABLE但不復雜的SQL腳本,以便罰款。

+1

因此您使用了哪種CursorType? – kobik 2016-11-08 11:52:19

+0

無論您何時放棄此聲明,都是默認設置。 – 2016-11-17 03:20:37

1

此錯誤的潛在來源是用更大的值更新char字段。

示例:表單具有最大長度屬性設置爲20個字符的編輯框,Oracle數據庫表中的字段定義爲char(10)。 使用10個字符(或更少)進行更新可以正常工作,但更新10個以上字符會導致ADOQuerry.UpdateBatch()中出現「多步驟...」錯誤。 你也必須知道CHAR將會有20個字符。考慮在編輯框中修剪值。 CHAR的行爲與VARCHAR2類型不同。

+0

您使用的是ADO的ORACLE? – 2013-08-18 05:49:06

0

如果您有參數查詢,請檢查查詢中參數的數目是否與腳本匹配...!

相關問題