转换 DTS.将 System.Object 类型的变量放入列表中



我有一个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()); 
}
  1. 创建一个新的包变量并将其调用ConnectionStringOle
  2. 添加 ForEach 循环
  3. 类型:每个 ADO 枚举器
  4. ADO 对象源变量:选择 ObjectRs。
  5. 枚举器模式:所有表中的行(仅限 ADO.NET 数据集(
  6. 在"变量映射"中,将结果映射到步骤 1 中的新包变量
  7. 修改 SQL 服务器连接管理器以将 ConnectionString 属性设置为 ConnectionStringOle 值。

从那里,执行每个循环迭代需要执行的任何操作。

注意:如果仅提取服务器实例的名称,则应创建另一个包变量,将实例的名称解析为整个ConnectionString值。可以通过将现有连接字符串的值复制到变量表达式中来获取此信息。

相关内容

  • 没有找到相关文章

最新更新