文章編號: 269495 - 上次校閱: 2005年10月18日 - 版次: 3.0

PRB:開啟 ADO 連線時「多重步驟 OLE DB 操作發生錯誤」

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
本文曾發行於 CHT269495
重要 本文包含有關修改登錄的相關資訊。修改登錄之前,請務必將它備份起來,並瞭解如何在發生問題時還原登錄。如需有關如何備份、還原和編輯登錄的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
256986? (http://support.microsoft.com/kb/256986/ ) Microsoft Windows 登錄說明

在此頁中

全部展開 | 全部摺疊

徵狀

當您試著開啟 ActiveX Data Objects (ADO) 連線時,發生下列錯誤:
Run-time error '-2147217887 (80040e21):'

多重步驟操作發生錯誤。如果可以,請檢查每一個 OLE DB 狀態值。不用執行任何動作。

發生的原因

這錯誤可能有二個原因:
  • 登錄中,OLE DB 提供者之 CLSID 機碼下,可能有命名為 OLEDB_SERVICES 的項目。如果使用 OLE DB 提供者與 OLEDB_SERVICES 項目的 ADO 連線,且 ADO 試著設定提供者不支援的屬性,就會發生這個錯誤。如需此登錄項目的詳細資訊,請參閱<解決方案>一節。
  • 如果有 OLEDB_SERVICES 項目,但 ADO 連線字串有問題,就會發生這個錯誤。
如果 OLEDB_SERVICES 登錄項目不存在,設定屬性的呼叫就會直接呼叫提供者。如果提供者不支援該屬性,ADO 執行的 SetProperties OLE DB 呼叫就會失敗。如果連線時需要此屬性,就會發生嚴重的錯誤。如果連線字串明確包括此屬性,連線時就需要此屬性。

如果屬性設定是選擇性的,就不會發生嚴重的錯誤。這就是當沒有明確設定連線字串中的屬性而進行連線時會發生的狀況。這時,ADO 會將屬性設定為 True,但標示為選擇性。

解決方案

如果需要替代的解決方案,請使用下列其中一種方法:
  • ADO 連線字串不要使用「Persist Security Info」關鍵字。
  • 增加下列的 OLEDB_SERVICES 登錄項目:

    注意 只能在支援 COM 彙總的提供者之登錄機碼中建立 OLEDB_SERVICES 值。Exchange OLE DB 提供者並不支援 COM 彙總,如果您建立該值,就會發生下列錯誤:
    0x80040E22
    Non-NULL controlling IUnknown was specified, and either the requested interface was not IUnknown, or the provider does not support COM aggregation. (已指定非 NULL 控制的 IUnknown,但是所要求的介面不是 IUnknown,且提供者也不支援 COM 彙總)

    警告 不當使用「登錄編輯程式」可能會導致嚴重的問題,甚至必須重新安裝作業系統。Microsoft 並不保證可以解決您不當使用「登錄編輯程式」所導致的問題。請自行承擔使用「登錄編輯程式」的一切風險。
    1. 啟動 [登錄編輯程式]。
    2. 在 HKEY_CLASSES_ROOT\CLSID 下的登錄找出 OLE DB 提供者的 CLSID。例如,下列是 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 的登錄機碼:
      HKEY_CLASSES_ROOT\CLSID\{0C7FF16C-38E3-11d0-97AB-00C04FC2AD98}
      按一下 CLSID,然後按在 [編輯] 功能表按一下 [新增值],然後新增下列登錄值:
      數值名稱:OLEDB_SERVICES
      資料類型:REG_DWORD
      數值:0xFFFFFFFF
      注意 如果要找出您使用的提供者之 CLSID,請在 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ 下的登錄搜尋提供者的 ProgID (例如,SQLOLEDB)。在 ProgID 下會有命名為 CLSID 的機碼。
  • 如果滿足上述條件之後仍收到錯誤,請檢查連線字串是否有其他錯誤。

其他相關資訊

重現問題的步驟

將下列程式碼貼在 Microsoft Visual Basic 標準執行檔專案,將專案引用設定為 Microsoft ActiveX Data Objects,然後加以執行。如果使用 DTSFlatFile 提供者或不支援其中一個連線字串屬性 (例如「Persist Security Info」) 的任何 OLE DB 提供者,就會發生錯誤。
Private Sub Command1_Click()

Dim cn As New Connection

cn.Open "Provider=DTSFlatFile;Persist Security Info=True;" & _
            "Data Source=Mysql;Mode=Read;File Format=0;File Type=1;" & _
            "Skip Rows=0;First Row Column Name=False;Number of Column=0;" & _
            "Max characters per delimited column=255;" '<------ Error Occurs Here
            
End Sub
				

?考

如需有關此錯誤的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
228935? (http://support.microsoft.com/kb/228935/ ) FIX:Uninitialized String Variables, Empty String Values, Jet Provider, and Errors Occurred
253157? (http://support.microsoft.com/kb/253157/ ) BUG:Identity field remains read-only after executing SET IDENTITY_INSERT ON statement

這篇文章中的資訊適用於:
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.5
  • Microsoft ActiveX Data Objects 2.6
  • Microsoft ActiveX Data Objects 2.7
關鍵字:?
kbprb kbprovider KB269495
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
Retired KB Article依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。