You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,用来存储拼接好的完整邮件内容。

拼接文本的实现步骤

  1. 在包的OnPostExecute事件处理程序,或者控制流的末尾节点后新增一个脚本任务
  2. 该脚本任务的可写变量添加User::ErrorMailBody,只读变量添加User::CompleteErrorDescription
  3. 脚本代码参考:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:45:03