環境の説明
asp.net から実行する SSIS タスクがあり、パッケージは UNC パスを介して Excel ファイルからデータを取得し、そのデータを SQL Server データベースに配置します。SSIS をファイル システムに展開しました。これには Windows 認証データベース接続があり、IIS ユーザーにはデータベース アクセスがあります。Web アプリケーションをホストするために使用した AppPoolUser としてログインし、問題のファイルを開いたり変更したりして、これらの基本的なアクセス許可を取得できます。Web アプリは x86 でコンパイルされています。
それが機能する場合:
- 私のユーザーまたは appPool ユーザーの下のサーバー上のブラウザーで Web アプリから実行する場合
- BIDS を実行しているサーバーに自分としてログインした場合
- BIDS を実行しているサーバーに AppPoolUser としてログインした場合
- AppPoolUser を使用してサーバー上のスケジュールされたタスクから実行する場合
うまくいかないとき:
- IIS が asp.net アプリをホストしているマシンではなく、クライアント ブラウザーから実行する場合
私の質問
クライアントとサーバーの違いと、それを機能させるにはどうすればよいですか? Web アプリを実行すると、すべての接続が AppPool ユーザーを経由するので、含まれるどのマシン サーバーでも同じように動作するはずだという印象を受けましたか?
エラーがクライアント ブラウザに返される
SSIS エラー コード DTS_E_OLEDBERROR。OLE DB エラーが発生しました。エラー コード: 0x80004005。OLE DB レコードが利用可能です。ソース: "Microsoft Office Access データベース エンジン" Hresult: 0x80004005 説明: "Microsoft Office Access データベース エンジンは、ファイル '\\myserver\My folder\myfile.xlsx' を開いたり、書き込んだりできません。別のユーザーによって既に排他的に開かれています。または、そのデータを表示および書き込む権限が必要です。」SSIS エラー コード DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。接続マネージャー "MyExcelFileConnection" への AcquireConnection メソッドの呼び出しが、エラー コード 0xC0202009 で失敗しました。これより前に、AcquireConnection メソッドの呼び出しが失敗した理由に関する詳細情報を含むエラー メッセージが投稿される場合があります。コンポーネント "Excel ソース" (1) は検証に失敗し、エラー コード 0xC020801C を返しました。1 つ以上のコンポーネントが検証に失敗しました。タスクの検証中にエラーが発生しました。
C# SSIS パッケージを実行するコード
string pkgLocation;
Package pkg;
Application app;
DTSExecResult pkgResults;
string result = string.Empty;
string dtsErrors = string.Empty;
try
{
pkgLocation = packagePath;
app = new Application();
pkg = app.LoadPackage(pkgLocation, null);
pkgResults = pkg.Execute();
foreach (DtsError local_DtsError in pkg.Errors)
dtsErrors += " " + local_DtsError.Description;
result = pkgResults.ToString();
}
catch (Exception exception)
{
result = exception.Message;
}