"运行时错误调用目标抛出异常"来自脚本任务

时间:2015-03-11 21:07:28

标签: c# ssis script-task

我有一个带有脚本任务的SSIS包,当我尝试在本地系统中运行它时出现以下错误。它适用于我的同事和生产。但是,我无法在本地运行它来进行测试。我在main方法中保留了一个调试点,但它永远不会到达,我在进入main方法之前得到了错误。

enter image description here

我正在使用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));并评论其余的,我得到例外。 我可以访问该网址。

我在我的脚本任务中使用Microsoft.TeamFoundation.Client.dll和Microsoft.TeamFoundation.WorkItemTracking.Client.dll。但是,程序包中的dll版本是10.0,而我的GAC中的dll版本是12.0。这会导致问题吗?

6 个答案:

答案 0 :(得分:2)

我有同样的问题(即相同的错误代码错误:0x1 ......)。

问题在于从丢失的文件夹中引用了一些库。

删除引用并从正确的路径添加它们修复了问题。

与错误代码相关的Microsoft参考(https://msdn.microsoft.com/en-us/library/ms345164.aspx)非常通用,对您没有多大帮助。 但是,阅读其他文章很可能表明运行脚本任务的未知失败原因。

  • 十六进制代码:0x1
  • 十进制代码:1
  • 符号名称:DTS_MSG_CATEGORY_SERVICE_CONTROL
  • 描述:功能不正确。

答案 1 :(得分:1)

我通过更改 SSIS项目 TargetServerVersion 修复了此错误。

Integration Services Project Property Pages

答案 2 :(得分:1)

就我而言,这是缺少DLL 或服务器上没有安装正确的版本。

在本地进行的所有测试都很好,但是在服务器上,错误消息Runtime error Exception has been thrown by the target of an invocation不断弹出。

没有异常处理程序能够捕获该错误-脚本任务中的代码甚至在需要DLL时也不会执行,而该DLL不在服务器的程序集缓存中(它可能会在本地计算机,也有相同的错误。

这里的困难是找出丢失的内容,然后将引用更新为正确的版本,或者使用gacutil在程序集缓存中安装丢失的DLL。我进行调试的方式是删除脚本任务中的代码部分,直到不会出现该错误为止,然后分析缺少的部分以供参考。

答案 3 :(得分:0)

它是固定的,当添加对dll版本12.0.0的引用并将Target Framework更改为.Net Framework 4.5

答案 4 :(得分:0)

当我在Dts.Variables [“ User :: xxxx] .Value();中引用传递的ssis变量时,收到此错误消息,其中xxxx不存在并且未从调用程序传递。 Console.Writeline引用不存在的传递变量。

答案 5 :(得分:0)

这只是一种不同的情况,并非最终目的是所有人的全部解决方案。

当我将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