如何在SSIS脚本任务的静态方法中访问DTS变量?
SSIS脚本任务静态方法访问变量的修正方案
问题根源
C#里静态方法属于类本身,不属于类的实例对象,所以没法直接访问非静态的Dts对象,也不能直接使用Main方法里的局部变量。你之前在静态方法里调用Dts.Variables报错,就是因为Dts是脚本任务类的实例成员,静态方法无权直接访问。
修正方法(两种可选)
方法1:将变量作为参数传入静态方法
这是最直接的方式,在Main方法里先获取所有变量值,然后调用静态方法时把这些值传进去,静态方法用参数构建连接字符串即可。
示例代码:
using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Data.SqlClient; namespace ST_xxxxxxxxx { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { public void Main() { // 1. 在Main中获取SSIS变量值 string sourceServer = Dts.Variables["SourceServer"].Value.ToString(); string sourceDB = Dts.Variables["SourceDatabase"].Value.ToString(); string destServer = Dts.Variables["DestinationServer"].Value.ToString(); string destDB = Dts.Variables["DestinationDatabase"].Value.ToString(); // 2. 调用静态方法,传入变量参数 CopySQLTable(sourceServer, sourceDB, destServer, destDB); Dts.TaskResult = (int)ScriptResults.Success; } // 3. 修改静态方法,添加参数接收变量值 private static void CopySQLTable(string sourceServer, string sourceDB, string destServer, string destDB) { // 用参数构建源/目标连接字符串 string sourceConnStr = $"Server={sourceServer};Database={sourceDB};Integrated Security=True;"; string destConnStr = $"Server={destServer};Database={destDB};Integrated Security=True;"; // 数据复制逻辑示例(按需替换表名和查询) using (SqlConnection sourceConn = new SqlConnection(sourceConnStr)) { sourceConn.Open(); string query = "SELECT * FROM YourSourceTable"; using (SqlCommand cmd = new SqlCommand(query, sourceConn)) using (SqlDataReader reader = cmd.ExecuteReader()) using (SqlConnection destConn = new SqlConnection(destConnStr)) using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destConn)) { destConn.Open(); bulkCopy.DestinationTableName = "YourDestinationTable"; bulkCopy.WriteToServer(reader); } } } enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure } } }
方法2:将静态方法改为实例方法
如果不想传参数,可以把CopySQLTable改成非静态方法(去掉static关键字),这样方法里可以直接访问类的成员变量,或者直接调用Dts.Variables(推荐先把变量存到类成员里,避免多次访问Dts)。
示例代码:
using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Data.SqlClient; namespace ST_xxxxxxxxx { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { // 定义类成员变量存储服务器/数据库名 private string _sourceServer; private string _sourceDB; private string _destServer; private string _destDB; public void Main() { // 1. 将SSIS变量值存入类成员 _sourceServer = Dts.Variables["SourceServer"].Value.ToString(); _sourceDB = Dts.Variables["SourceDatabase"].Value.ToString(); _destServer = Dts.Variables["DestinationServer"].Value.ToString(); _destDB = Dts.Variables["DestinationDatabase"].Value.ToString(); // 2. 调用实例方法(无需传参) CopySQLTable(); Dts.TaskResult = (int)ScriptResults.Success; } // 3. 去掉static关键字,改为实例方法 private void CopySQLTable() { // 使用类成员变量构建连接字符串 string sourceConnStr = $"Server={_sourceServer};Database={_sourceDB};Integrated Security=True;"; string destConnStr = $"Server={_destServer};Database={_destDB};Integrated Security=True;"; // 数据复制逻辑示例(按需替换表名和查询) using (SqlConnection sourceConn = new SqlConnection(sourceConnStr)) { sourceConn.Open(); string query = "SELECT * FROM YourSourceTable"; using (SqlCommand cmd = new SqlCommand(query, sourceConn)) using (SqlDataReader reader = cmd.ExecuteReader()) using (SqlConnection destConn = new SqlConnection(destConnStr)) using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destConn)) { destConn.Open(); bulkCopy.DestinationTableName = "YourDestinationTable"; bulkCopy.WriteToServer(reader); } } } enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure } } }
注意事项
- 替换代码中的
YourSourceTable和YourDestinationTable为实际表名 - 若使用SQL身份验证,将连接字符串改为
Server={server};Database={db};User ID={user};Password={pwd};,可新增SSIS变量存储账号密码 - 确保脚本任务已勾选四个变量的ReadOnly权限(在脚本任务编辑器的「脚本」选项卡,点击「编辑脚本」旁的「变量」按钮,选中目标变量)
内容的提问来源于stack exchange,提问作者Nish
相关产品推荐
相关产品推荐

