web-dev-qa-db-ja.com

エラー0xC0011008XMLからのロード中にパッケージをロードできませんでした

環境:

  • Windows Server 2008 SP2 Enterprise Edition64ビット

  • SQL Server 2008 SP3 Standard Edition64ビット

  • 以前はSQLServerがありました2005 Developer Edition32ビット統合サービス。これでアンインストールされました。

  • ASP.NET v4

  • IIS 7

ASP.NETアプリケーションは、ManagedDTS.dllアセンブリを使用してSSISパッケージをインプロセスで実行する必要があります。 Excel 2007-2010ファイルをインポート/エクスポートできるように、(2005ではなく)BIDS2008でSSISパッケージを開発しています。 ASP.NETアプリケーションは、.NET Framework4コードにコンパイルされたVisualStudio .NET2010で開発されています。 32ビットのWindows7開発マシンで次のバージョンのManagedDTS.dllを参照しています。

C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SQLServer.ManagedDTS.dll

アプリケーションをWindows200864ビットサーバーに展開します。そのサーバー上の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 2005xmlパーサーによって解析されていると思わせます。 SSIS 2005を完全にアンインストールしたので、それは不可能なはずです。

興味深い情報

そこで、新しい空白のパッケージを作成し、実際のパッケージをそれに置き換えました。それは正しく機能しました。私は、接続マネージャーがパッケージに存在する場合にのみエラーが現れることを確認しました。これは、どういうわけか32ビットモードでパッケージが不正なSSIS 2005 dllによって解析されており、2008パッケージの接続マネージャーセクションが2005の対応するものとは十分に異なるxmlであるという私の理論をサポートしています。ちょうど私の理論。

私にとってノンスターター

おそらく、32ビットバージョンのDTExecを介してコマンドラインからパッケージを実行することを提案する人もいるでしょう。それは確かに機能しますが(私はそれを確認しました)、それは私にとっての解決策ではありません。アプリケーションがパッケージ内で定義されたグローバル変数を簡単に取得および設定できるように、処理中のコードからパッケージを実行する必要があります。コマンドラインからパッケージを実行することは、私には、存在してはならない問題の回避策のように思えます。

何か案は?

3
Chad Braun-Duin

さて、これは承認またはIDの問題であることが判明しました。私のアプリケーションは、リクエストごとに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アセンブリは、「AppPrincipal」IDを解決できなかったため、SSISパッケージを開く(または解析する)ことができませんでした。それが私の推測です。これに対する修正は、Thread.CurrentPrincipalの変更を単に停止することでした。

2
Chad Braun-Duin