首页 > 解决方案 > 调用目标引发异常 - 在 Visual Studio 中执行 .dtsx 文件时

问题描述

我开发了一个 ssis 包,我有一个脚本,它从 .txt 文件中获取少量文本命令,将它们存储在变量中,我使用这些变量来查看下一步要做什么以及要执行哪个 dft。

当我转到 .dtsx 文件--> 右键单击​​--> 执行--> 我收到错误消息“调用的目标已引发异常”。

在此处输入图像描述

但是,当我停止运行包并尝试重新执行它时,它会成功运行。

我试图将它部署到集成服务目录,它抛出了与我在报告文件中看到的相同的错误

脚本任务错误:调用的目标已抛出异常

varERMLoadTxt保存流阅读器读取的文本文件路径

public void Main()
        {
            // TODO: Add your code here
            string path = Dts.Variables["User::varERMLoadTxt"].Value.ToString();
            using (StreamReader sr = File.OpenText(path))
            {
                string line = File.ReadAllText(path);
                string[] lines = line.Split(',');
                if(lines[0].Equals("load", StringComparison.CurrentCultureIgnoreCase))
                Dts.Variables["User::varIsLoad"].Value = true;
                else if (lines[0].Equals("update", StringComparison.CurrentCultureIgnoreCase))
                    Dts.Variables["User::varIsUpdate"].Value = true;
                Dts.Variables["User::varCommand"].Value = lines[0].ToString();
                Dts.Variables["User::varAnalysisDate"].Value = lines[1].ToString();
                sr.Close();



            }
            Dts.TaskResult = (int)ScriptResults.Success;
        }

enum ScriptResults
{
    Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
    Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};

标签: c#sql-serverssisetlscript-task

解决方案


我有 3 条建议:

  1. 使用 try ... catch 块和 Dts.FireError 方法来读取真正的异常:
  1. 打开文件前检查文件是否存在
  2. 检查变量名称是否正确(注意变量名称区分大小写)

整个代码应该看起来像

public void Main()
        {
        try{    

                string path = Dts.Variables["User::varERMLoadTxt"].Value.ToString();
            
        if (File.Exists(path))
        {
            using (StreamReader sr = File.OpenText(path))
                {
                string line = File.ReadAllText(path);
                    string[] lines = line.Split(',');
    
                    if(lines[0].Equals("load", StringComparison.CurrentCultureIgnoreCase))
                        Dts.Variables["User::varIsLoad"].Value = true;
                else if (lines[0].Equals("update", StringComparison.CurrentCultureIgnoreCase))
                    Dts.Variables["User::varIsUpdate"].Value = true;
                
            Dts.Variables["User::varCommand"].Value = lines[0].ToString();
                    Dts.Variables["User::varAnalysisDate"].Value = lines[1].ToString();
                    sr.Close();
                     }
            }   

            Dts.TaskResult = (int)ScriptResults.Success;    

        }catch(Exception ex){

            Dts.FireError(0,"An error occured", ex.Message,String.Empty, 0);
                Dts.TaskResult = (int)ScriptResults.Failure;
 
            }

        }

enum ScriptResults
{
    Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
    Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};

推荐阅读