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

SSIS循环内Script Task报Object reference not set错误及死锁问题求助

SSIS脚本任务空引用报错修复方案

核心问题根因

你遇到的Object reference not set to an instance of an object错误直接原因如下:

  • 脚本内varCollection变量初始化赋值为null后,用于锁定、获取SSIS变量集合的两行代码被注释,没有给varCollection赋值就直接调用其索引器访问User::EmailData变量,触发空引用异常。
  • 额外注意:变量用完后没有主动释放锁,也是之前死锁问题的诱因之一。

修复步骤

1. 修正脚本Main方法逻辑

替换你的Main方法为以下代码,取消变量获取的注释,增加异常捕获和锁释放逻辑:

public void Main()
{
    Variables varCollection = null;
    try
    {
        string User_Recepient_Email_ID = Dts.Variables["User::UserEml"].Value.ToString();
        
        // 取消注释变量获取逻辑,改为读锁更合理(EmailData变量只需读取)
        Dts.VariableDispenser.LockForRead("User::EmailData");
        Dts.VariableDispenser.GetVariables(ref varCollection);
        var emailData = varCollection["User::EmailData"].Value;

        OleDbDataAdapter da = new OleDbDataAdapter();
        DataTable dt = new DataTable();
        da.Fill(dt, emailData);

        SendMailMessage("loadJob@xyz.com", User_Recepient_Email_ID, "ETL加载状态报告", ConvertDataTableToHTML(dt), true, "smtp.xxxxxxxxxxxxx.org");
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    catch (Exception ex)
    {
        // 输出详细错误日志,方便后续排查
        Dts.Events.FireError(0, "脚本任务", $"错误信息:{ex.Message}\n堆栈:{ex.StackTrace}", string.Empty, 0);
        Dts.TaskResult = (int)ScriptResults.Failure;
    }
    finally
    {
        // 主动释放变量锁,避免循环过程中出现锁冲突、死锁问题
        if (varCollection != null)
        {
            varCollection.Unlock();
        }
    }
}

2. 校验脚本任务权限配置

打开脚本任务的编辑器,确认只读变量配置项中已经添加了User::UserEml和User::EmailData两个变量,避免权限不足导致的变量访问错误。

3. 死锁问题后续优化建议

修复当前错误后如果仍出现死锁,可做如下调整:

  • 业务允许脏读的前提下,拉取订单数据的SQL语句添加WITH(NOLOCK)提示
  • 调整数据库事务隔离级别为读提交快照隔离(RCSI)
  • 在Foreach循环中添加延迟任务,每次执行完成后等待1~2秒再执行下一轮循环

内容的提问来源于stack exchange,提问作者user4912134

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:24:07