由於錯誤 0xC0011008 從 XML 載入錯誤,包無法載入
環境:
- Windows Server 2008 SP2 企業版 64 位
- SQL Server 2008 SP3 標準版 64 位
- 以前有 SQL Server 2005 Developer Edition 32 位集成服務。現在已經解除安裝了。
- ASP.NET v4
- IIS 7
我們的 ASP.NET 應用程序需要使用 ManagedDTS.dll 程序集在程序內執行 SSIS 包。我們正在 BIDS 2008(而不是 2005)中開發 SSIS 包,以便我們可以導入/導出 Excel 2007-2010 文件。我們的 ASP.NET 應用程序正在 Visual Studio .NET 2010 中開發,編譯為 .NET Framework 4 程式碼。我在我的 32 位 Windows 7 開發機器上引用了以下版本的 ManagedDTS.dll。
C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll
我們將應用程序部署到 Windows 2008 64 位伺服器。該伺服器上的 IIS 7 用於切換以 32 位或 64 位模式執行我們的應用程序。
當我們在 64 位模式下執行應用程序並執行 SSIS 包時,包確實解析正確。但是,它給出了一個執行時錯誤,告訴我們 Excel 連接管理器在 64 位版本的 SSIS 中不受支持。不過,這不是我現在需要解決的問題。
真正的問題在於在應用程序以 32 位模式執行時執行包。執行會引發未處理的異常,並給出以下錯誤消息:
The package failed to load due to error 0xC0011008 “Error loading from XML. No further detailed error information can be specified for this problem because no Events object was passed where detailed error information can be stored.”. This occurs when CPackage::LoadFromXML fails.
此錯誤消息使我認為 SSIS 2005 xml 解析器正在以某種方式解析包。這是不可能的,因為我已經完全解除安裝了 SSIS 2005。
有趣的資訊
所以我創建了一個全新的空白包,並用它替換了真正的包。它工作正常。我現在已經確定該錯誤僅在包中存在連接管理器時才會出現。這支持了我的理論,即在 32 位模式下,包正在被流氓 SSIS 2005 dll 解析,並且 2008 包中的連接管理器部分與 2005 對應的 xml 有很大不同。只是我的理論。
不適合我
可能有些人會建議通過 32 位版本的 DTExec 從命令行執行包。雖然這肯定會奏效(我已經確認),但這對我來說不是解決方案。我需要從程序中的程式碼執行包,以便應用程序可以輕鬆獲取和設置包中定義的全域變數。對我來說,從命令行執行包似乎是解決不應該存在的問題的一種解決方法。
有任何想法嗎?
好吧,事實證明這是一個授權或身份問題。我的應用程序在每個請求上都將 Thread.CurrentPrincipal 設置為自定義 IPrincipal 實例。以下是程式碼的解釋:
Public Class AppPrincipal Implements IPrincipal ... End Class
…然後在 Global.asax.vb
Sub Global_AcquireRequestState(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.AcquireRequestState Thread.CurrentPrincipal = New AppPrincipal() End Sub
我的猜測是 ManagedDTS.dll 程序集將無法打開(或解析)SSIS 包,因為它無法解析“AppPrincipal”身份。這是我的猜測。解決此問題的方法是簡單地停止變異 Thread.CurrentPrincipal。