スクリプトタスクを含むSSISパッケージがあります。ローカルシステムで実行しようとすると、次のエラーが表示されます。同僚だけでなく、本番でも問題なく機能します。ただし、テストのためにローカルで実行することはできません。 mainメソッドにデバッグポイントを保持していますが、到達しないため、mainメソッドに進む前にエラーが発生します。
VS 2010、.Net framework 4.5を使用しています。
スクリプトタスクはコンパイルします。 SSISパッケージ "..\Test.dtsx"が起動すると、次のメッセージが表示されます。エラー:テスト時の0x1:呼び出しのターゲットによって例外がスローされました。タスクが失敗しました:SSISパッケージ "..\Test.dtsx"のテストが完了しました:成功しました。プログラム「[2552] DtsDebugHost.exe:DTS」はコード0(0x0)で終了しました。
コードは次のとおりです。
public void Main()
{
try
{
LogMessages("Update Bug package execution started at :: " + DateTime.Now.ToLongTimeString());
LogMessages("Loading package configuration values to local variables.");
strDBConn = Dts.Variables["User::DBConnection"] != null ? Dts.Variables["User::DBConnection"].Value.ToString() : string.Empty;
strTPCUrl = Dts.Variables["User::TPCUrl"] != null ? Dts.Variables["User::TPCUrl"].Value.ToString() : string.Empty;
TfsTeamProjectCollection objTPC = new TfsTeamProjectCollection(new Uri(strTPCUrl));
WorkItemStore objWIS = new WorkItemStore(objTPC);
WorkItemCollection objWIC = objWIS.Query("SELECT...");
foreach (WorkItem wi in objWIC)
{
}
}
catch(Exception ex)
{
}
TfsTeamProjectCollectionからのコードにコメントしたときobjTPC = new TfsTeamProjectCollection(new Uri(strTPCUrl));スクリプトは正常に実行されます。ただし、TfsTeamProjectCollectionを保持する場合、objTPC = new TfsTeamProjectCollection(new Uri(strTPCUrl));残りをコメントすると、例外が発生します。 URLにアクセスできます。
スクリプトタスクでMicrosoft.TeamFoundation.Client.dllとMicrosoft.TeamFoundation.WorkItemTracking.Client.dllを使用しています。ただし、パッケージのdllバージョンは10.0で、GACのdllのバージョンは12.0です。それが問題を引き起こしますか?
同じ問題が発生しました(つまり、同じエラーコードError:0x1 ...)。
問題は、欠落しているフォルダーから参照されるライブラリの一部にありました。
参照を削除して正しいパスから追加し直すと、問題が修正されました。
エラーコードに関連するMicrosoftリファレンス( https://msdn.Microsoft.com/en-us/library/ms345164.aspx )は非常に一般的であり、あまり役に立ちません。ただし、他の記事を読むと、スクリプトタスクを実行するための未知の失敗理由を示している可能性が高いです。
これは単なる別の状況であり、すべてをすべての人に解決することを目的とするものではありません。
DLLをGACにインストールしていたときに、スクリプトを管理者として実行するのを忘れていたため、スクリプトはエラーなく静かに実行されました。
それが私が間違っていたことに気付いたとき、私は本当にばかげたと感じました。うまくいけば、これが他の人がこんなに馬鹿げたことに時間を浪費するのを防ぐのに役立つことを願っています。
参考までに、これはDLLをGACにインストールするために使用するもので、管理者として実行していないときに通知するように修正しました。
#https://superuser.com/questions/749243/detect-if-powershell-is-running-as-administrator
$isAdmin = ([Security.Principal.WindowsPrincipal] `
[Security.Principal.WindowsIdentity]::GetCurrent() `
).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if($isAdmin -eq $false)
{
Write-Host "You have to run this script as Administrator or it just won't work!" -ForegroundColor Red
return;
}
$strDllPath = "C:\PathToYourDllsHere\"
#Note that you should be running PowerShell as an Administrator
[System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
$publish = New-Object System.EnterpriseServices.Internal.Publish
$arr = @(
"YourDLL01.dll",
"YourDLL02.dll",
"YourDLL03.dll"
)
get-date
foreach($d in $arr)
{
$p = ($strDllPath + $d);
$p
$publish.GacInstall($p);
}
#If installing into the GAC on a server hosting web applications in IIS, you need to restart IIS for the applications to pick up the change.
#Uncomment the next line if necessary...
#iisreset
PowerShellスクリプトが管理モードで実行されているかどうかを判断する方法の功績: https://superuser.com/questions/749243/detect-if-powershell-is-running-as-administrator
Dts.Variables ["User :: xxxx] .Value();で渡されたssis変数を参照すると、このエラーメッセージが表示されました。ここで、xxxxは存在せず、呼び出し側プログラムから渡されませんでした。存在しない渡された変数を参照します。
Dllバージョン12.0.0への参照を追加し、Target Frameworkを.Net Framework 4.5に変更すると、その修正