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

ExecuteNonQuery报错:Connection属性未初始化——Foreach循环参数加载问题

解决SSIS脚本任务中ExecuteNonQuery: Connection property has not been initialized错误

咱们先把这个错误的本质说透:你代码里的SqlCommand对象还没绑定上有效的数据库连接,就急着调用ExecuteNonQuery()方法了——系统根本不知道要把SQL命令发给哪个数据库,可不就报错嘛。

看你贴的代码,目前只获取了TenantID和LogFolder这两个变量,数据库连接的核心逻辑完全是空的,这就是问题所在。下面一步步给你修正:

第一步:确认SSIS包的连接配置

首先得保证你的SSIS包已经配置了数据库连接管理器(比如ADO.NET或OLE DB类型),后续脚本要靠它获取数据库连接信息。

第二步:补全脚本的数据库操作逻辑

我把你的代码补全,加上完整的连接、命令执行和资源管理逻辑,你可以根据实际需求调整SQL语句:

#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;
#endregion
namespace ST_564774fbfa9f46
{
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        public void Main()
        {
            // 用于FireInformation的参数
            bool fireAgain = true;
            
            try
            {
                int TenantID = (int)Dts.Variables["User::TenantID"].Value;
                string LogFolder = Dts.Variables["User::LogFolder"].Value.ToString();
                
                // 从SSIS连接管理器拿连接字符串,这里替换成你实际的连接管理器名称
                string connectionString = Dts.Connections["DBConnection"].ConnectionString;
                
                // 用using语句自动管理资源,不用手动关闭连接,异常时也会自动释放
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    
                    // 用参数化查询!别直接拼SQL,防注入还能避免语法错误
                    string sql = "INSERT INTO TenantLogs (TenantID, LogPath) VALUES (@TenantID, @LogPath)";
                    
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        // 给SQL参数赋值
                        cmd.Parameters.AddWithValue("@TenantID", TenantID);
                        cmd.Parameters.AddWithValue("@LogPath", LogFolder);
                        
                        // 执行命令,这里就是之前报错的ExecuteNonQuery,现在已经绑定了连接
                        int rowsAffected = cmd.ExecuteNonQuery();
                        
                        // 可选:输出执行日志到SSIS
                        Dts.Events.FireInformation(0, "Script Task", $"SQL执行成功,影响{rowsAffected}条数据", string.Empty, 0, ref fireAgain);
                    }
                }
                
                // 标记任务执行成功
                Dts.TaskResult = (int)DtsExecResult.Success;
            }
            catch (Exception ex)
            {
                // 捕获异常并输出错误信息
                Dts.Events.FireError(0, "Script Task", $"执行失败:{ex.Message}", string.Empty, 0);
                // 标记任务执行失败
                Dts.TaskResult = (int)DtsExecResult.Failure;
            }
        }
    }
}

几个必须注意的细节

  • 变量权限:要在脚本任务的ReadOnlyVariables(或ReadWriteVariables)里添加User::TenantID和User::LogFolder,不然脚本会找不到这些变量。
  • 连接管理器匹配:代码里Dts.Connections["DBConnection"]的名称要和你包中实际的连接管理器名称完全一致;如果用的是OLE DB连接,要换成OleDbConnection(对应命名空间System.Data.OleDb)。
  • 参数化查询:绝对不要直接把变量拼进SQL语句里,不仅容易触发SQL注入,还可能因为变量里的特殊字符导致SQL语法错误。
  • 资源管理:用using包裹SqlConnection和SqlCommand是最佳实践,能自动释放数据库连接,避免连接池耗尽。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:50:18