c# - 调用目标引发异常 - 在 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
};
解决方案
我有 3 条建议:
- 使用 try ... catch 块和 Dts.FireError 方法来读取真正的异常:
- 打开文件前检查文件是否存在
- 检查变量名称是否正确(注意变量名称区分大小写)
整个代码应该看起来像
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
};
推荐阅读
- bash - 如何在不修改文本本身且没有转义序列的情况下回显某些包含 $、!、' 和 " 等字符的文本?
- c# - 如何将自定义类对象的参数从 XAML 传递到 Xamarin Forms 中的 C# 构造函数?
- python - 考虑到字符串 [with str.contains] 在 python 中的位置,计算行数并创建标签列
- java - 如何在 Android 中播放和暂停 MediaSession
- python - 是否可以写不同行的文本的每个句子?
- python - 生成时如何在每个数字之间添加逗号?
- windows - 从 USB 设备向 Windows 提供 USB MIDI 端口名称的方法
- python - 如何在函数中使用“if”循环?
- javascript - 你如何在javascript中居中一个矩形?将矩形的 X 和 Y 位置作为矩形的中心
- python - 如何使用 KivyMD 工具栏切换屏幕