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

How to use a SSIS Dataset inside Dataflow Script component for Source?

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

我的第一个任务是执行 SQL 任务(CData PostgreSQL 任务)

这将 运行 Postgre 查询并将结果存储在数据类型为 DataSet

的变量 User::resultSet

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

在我的第二个任务中,我希望使用数据集作为我的来源。我试图通过使用脚本组件(来源)

来实现这一点

我的脚本

    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]; 但它们都抛出语法错误。

任何领导或指导将不胜感激。

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

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

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

其中这个变量是我在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;

试试这个

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

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

您可以使用以下方法使用 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());
        }