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
相关产品推荐
相关产品推荐

