SSIS中如何用C#合并事件处理程序错误描述并发送单封告警邮件
SSIS 合并错误信息统一发邮件解决方案
问题1:实现错误描述的追加写入
你现有代码的问题是每次触发错误事件时都会新建空列表,直接覆盖之前存储的错误内容,没有读取已有值做追加。
前置配置
先在脚本任务的配置页,把以下变量添加到对应栏位:
- 只读变量(ReadOnlyVariables):
System::ErrorDescription - 可写变量(ReadWriteVariables):
User::CompleteErrorDescription
修改后脚本代码
using System.Collections.Generic; public void Main() { List<string> errorList; // 先判断对象变量是否已经存储了列表 if (Dts.Variables["User::CompleteErrorDescription"].Value == null) { errorList = new List<string>(); } else { // 已有列表则直接读取转换 errorList = (List<string>)Dts.Variables["User::CompleteErrorDescription"].Value; } // 追加当前捕获的错误信息 errorList.Add(Dts.Variables["System::ErrorDescription"].Value.ToString()); // 写回变量 Dts.Variables["User::CompleteErrorDescription"].Value = errorList; Dts.TaskResult = (int)ScriptResults.Success; }
问题2:对象变量转换为邮件可使用的文本
对象类型变量无法直接作为Send Mail Task的消息源,你需要新增一个字符串类型的SSIS变量,比如命名为User::ErrorMailBody,用来存储拼接好的完整邮件内容。
拼接文本的实现步骤
- 在包的OnPostExecute事件处理程序,或者控制流的末尾节点后新增一个脚本任务
- 该脚本任务的可写变量添加
User::ErrorMailBody,只读变量添加User::CompleteErrorDescription - 脚本代码参考:
using System.Collections.Generic; using System.Text; public void Main() { if (Dts.Variables["User::CompleteErrorDescription"].Value != null) { List<string> errorList = (List<string>)Dts.Variables["User::CompleteErrorDescription"].Value; StringBuilder sb = new StringBuilder(); sb.AppendLine("SSIS包执行过程中捕获到以下错误:"); sb.AppendLine("--------------------------------"); // 遍历所有错误拼接为文本 for (int i = 0; i < errorList.Count; i++) { sb.AppendLine($"错误{i+1}:{errorList[i]}"); } // 写回字符串变量 Dts.Variables["User::ErrorMailBody"].Value = sb.ToString(); } else { Dts.Variables["User::ErrorMailBody"].Value = "SSIS包执行正常,未捕获到错误。"; } Dts.TaskResult = (int)ScriptResults.Success; }
Send Mail Task 配置
把Send Mail Task的MessageSourceType设置为变量,MessageSource选择刚刚创建的User::ErrorMailBody变量即可,邮件发送的逻辑放在上面的拼接脚本之后执行即可。
内容的提问来源于stack exchange,提问作者Michael S Palatsi
相关产品推荐
相关产品推荐

