我有一个SSIS包,它执行SQL任务以获取我需要连接的服务器的名称。然后,该查询的结果存储在名为"服务器"的变量对象中。然后我想一次在每个服务器上运行另一个包,所以我想拆分出"服务器"变量。但是,当我在 C# 脚本任务中执行此操作时,我不断收到错误:
错误:脚本任务0x1:调用目标引发异常。
下面是拆分服务器变量的代码:
错误:脚本任务0x1:调用目标引发异常。
public void Main()
{
var serverlist = (string[])Dts.Variables["User::servers"].Value;
Dts.Variables["server1"].Value = serverlist[0];
Dts.TaskResult = (int)ScriptResults.Success;
}
它应该是一个非常简单的代码,但由于某种原因,它只是不起作用。
既然你已经提到过:
我有一个执行SQL任务以获取服务器名称的SSIS包
主要问题在以下行:
var serverlist = (string[])Dts.Variables["User::servers"].Value;
执行 SQL 任务不返回字符串列表,而是返回记录集对象。为了在脚本任务中读取它,您必须遵循以下帖子(您必须使用 OledbAdapter(:
- SSIS - 如何访问脚本任务中的记录集变量
从问题的标题来看,你似乎正在尝试从 SSIS 对象变量填充 C# 列表。 如果这是正确的,可以按如下方式完成。 可以使用 SSIS 对象变量的内容填充 DataTable
对象,或者如果要专门使用列表,可以从DataTable
填充列表,然后可以使用列表。 在下面的示例中,OleDBDataAdapter
用于使用 Fill
方法从 SSIS 对象变量填充DataTable
对象。 从对象变量填充的数据可以通过DataTable
中的DataRow
对象进行访问。 由于看起来SSIS对象变量只包含一个列,因此可以从每个DataRow
的列索引0访问它,dr[0]
下面。 你可能已执行此操作,但请确保 SSIS 对象变量位于脚本任务的ReadOnlyVariables
字段中。
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
List<string> serverNamesList = new List<string>();
OleDbDataAdapter dtAdapter = new OleDbDataAdapter();
DataTable serverNamesDataTable = new DataTable();
//populate data table
dtAdapter.Fill(serverNamesDataTable, Dts.Variables["User::ObjectVariable"].Value);
foreach (DataRow dr in serverNamesDataTable.Rows)
{
//either access server names from column index 0 of DataRow or add to list
serverNamesList.Add(dr[0].ToString());
}
- 创建一个新的包变量并将其调用
ConnectionStringOle
- 添加 ForEach 循环
- 类型:每个 ADO 枚举器
- ADO 对象源变量:选择 ObjectRs。
- 枚举器模式:所有表中的行(仅限 ADO.NET 数据集(
- 在"变量映射"中,将结果映射到步骤 1 中的新包变量
- 修改 SQL 服务器连接管理器以将
ConnectionString
属性设置为ConnectionStringOle
值。
从那里,执行每个循环迭代需要执行的任何操作。
注意:如果仅提取服务器实例的名称,则应创建另一个包变量,将实例的名称解析为整个ConnectionString
值。可以通过将现有连接字符串的值复制到变量表达式中来获取此信息。