将类型为System.Object的DTS.Variables转换为列表

时间:2019-05-28 16:21:59

标签: c# ssis etl script-task

我有一个执行SQL任务的SSIS包,以获取需要连接的服务器的名称。然后,该查询的结果存储在一个名为“服务器”的变量对象中。然后,我想一次在每个服务器上运行另一个程序包,因此我想拆分“ servers”变量。但是,当我在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;
}

这应该是一个非常简单的代码,但是由于某些原因,它根本无法正常工作。

3 个答案:

答案 0 :(得分:1)

自从您提到过:

  

我有一个执行SQL任务的SSIS程序包,以获取服务器名称

主要问题在以下几行:

var serverlist = (string[])Dts.Variables["User::servers"].Value;

Execute SQL Task不返回字符串列表,而是返回一个记录集对象。为了在脚本任务中阅读它,您必须遵循以下文章(您必须使用OledbAdapter)

答案 1 :(得分:0)

  1. 创建一个新的程序包变量,并将其命名为ConnectionStringOle
  2. 添加ForEach循环
  3. 类型: Foreach ADO枚举器
  4. ADO对象源变量:。选择ObjectR。
  5. 枚举器模式:所有表中的行(仅适用于ADO.NET数据集)
  6. 在“变量映射”中,将结果映射到步骤1中的新程序包变量
  7. 修改SQL Server连接管理器,将ConnectionString属性设置为ConnectionStringOle值。

从那里开始,执行每个循环迭代所需的操作。

注意:如果仅提取服务器实例的名称,则应创建另一个程序包变量,以将实例的名称解析为整个ConnectionString值。您可以通过将现有ConnectionString的值复制到变量表达式中来获得此功能。

答案 2 :(得分:0)

从问题的标题开始,您似乎正在尝试从SSIS对象变量填充C#列表。如果正确,则可以执行以下操作。您可以用SSIS对象变量的内容填充INFO - lqk4061 executed the pipeline at 2019-05-29 19:15:47 Logging in a loop - loop #0 对象,或者如果您要使用特定的列表,则可以从/** * The number of times the job may be attempted. * * @var int */ public $tries = 5; 填充列表,然后可以使用该列表在这之后。在下面的示例中,DataTable用于使用DataTable方法从SSIS对象变量填充OleDBDataAdapter对象。从对象变量填充的数据可以通过DataTable中的Fill对象进行访问。由于SSIS对象变量看起来只包含一个列,因此可以从下面每个DataRowDataTable的列索引0访问它。您可能已经完成了此操作,但是请确保SSIS对象变量位于脚本任务的DataRow字段中。

dr[0]