如何在源的数据流脚本组件中使用 SSIS 数据集?

问题描述

我正在寻找一种在 SSIS 数据流任务的脚本组件中使用我的数据集变量的方法,这是我迄今为止所尝试的

我的第一个任务是执行 sql 任务(CData Postgresql 任务)

这将运行 Postgre 查询并将结果存储在数据类型为 User::resultSet 的变量 DataSet

enter image description here

我的第二个任务是数据流任务

在我的第二个任务中,我希望使用数据集作为我的源。我试图通过使用 Script Component (Source) 来实现这一点

enter image description here

我的脚本

    public override void CreateNewOutputRows()
    {
        DataTable dt = (DataSet)Variables.resultSet;


        // The DataTable is Now ready to use! No more recordset quirks.
        foreach (DaTarow dr in dt.Rows)
        {

            // Add a new output row for this transformed data.
            OrdersBuffer.AddRow();

            // Now populate the columns
            OrdersBuffer.id = int.Parse(dr["id"].ToString());
            OrdersBuffer.created = int.Parse(dr["created"].ToString());
            OrdersBuffer.modified = int.Parse(dr["modified"].ToString());
        }
    }

问题

在我的脚本中,我想不出将数据集转换为数据表的方法

我相信我的脚本中的问题行是 DataTable dt = (DataSet)Variables.resultSet;

我也试过 DataTable dt = resultSet.Tables[0];DataTable dt = resultSet.Table[0];,但它们都抛出语法错误

非常感谢任何领导或指导。

解决方法

试试这个

DataTable dt = (Variables.resultSet as DataSet).Tables[0];

如果无法进行类型转换,可能会抛出异常。

,

我没有使用数据集变量类型,但我没有使用 OBJECT 类型变量和 MS SQL DB。如果您可以更改为使用对象变量,这应该对您有用(或者如果您不能,您可以看到我如何传递 OBJECT 变量并更新您的代码以类似方式访问该变量。

首先,我运行一个 SQL 任务,该任务将结果集作为 SSIS 中输出到我的 OBJECT 变量数据类型。然后我像这样将它传递给我的脚本任务:

Passing Variable to Script task

在 C# 脚本任务中,我使用以下代码访问 OBJECT 变量,然后将其转换为稍后使用的数据表

这里变量是我在 SSIS 包中的对象变量类型: User::ObjDataToSaveToExportFile

// this gets the data object and sets ti to a data table
            OleDbDataAdapter A = new OleDbDataAdapter();
            System.Data.DataTable dt = new System.Data.DataTable();
            A.Fill(dt,Dts.Variables["User::ObjDataToSaveToExportFile"].Value);

            // for test data
            //DataTable sourceTable = GetTestData();
            DataTable sourceTable = dt;
,

您可以使用以下使用 DataAdapter 填充数据表的方法。 Reference Article

public override void CreateNewOutputRows()
    {
        // Set up the DataAdapter to extract the data,and the DataTable object to capture those results
        OleDbDataAdapter da = new OleDbDataAdapter();
        DataTable dt = new DataTable();
        
        // Extract the data from the object variable into the table
        da.Fill(dt,Variables.resultSet);

        // Since we know the column metadata at design time,we simply need to iterate over each row in
        //  the DataTable,creating a new row in our Data Flow buffer for each
        foreach (DataRow dr in dt.Rows)
        {
             // Add a new output row for this transformed data.
            OrdersBuffer.AddRow();

            // Now populate the columns
            OrdersBuffer.id = int.Parse(dr["id"].ToString());
            OrdersBuffer.created = int.Parse(dr["created"].ToString());
            OrdersBuffer.modified = int.Parse(dr["modified"].ToString());
        }