【问题标题】:How to use a SSIS Dataset inside Dataflow Script component for Source?如何在源的数据流脚本组件中使用 SSIS 数据集?
【发布时间】:2021-06-28 06:55:41
【问题描述】:

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

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

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

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

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

我的脚本

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

任何线索或指导将不胜感激。

【问题讨论】:

    标签: c# ssis script-component


    【解决方案1】:

    试试这个

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

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

    【讨论】:

    • 太棒了!!它的工作原理我几天来一直在尝试解决这个问题.. 干杯,谢谢
    • 如果我可以询问更多问题的建议 - 我的结果集总是返回 1000 行,尽管它包含更多行(我在 Dataflow 源和 ADO 模拟器中运行它时注意到了这一点)。可以存储在单个数据集表中的行是否有任何限制
    • @MJoy,您可以将此作为单独的问题提出。
    【解决方案2】:

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

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

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

    这里变量是我在 SSIS 包中的对象变量类型: 用户::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;
    

    【讨论】:

    • 我的 CData PostGre SQL 任务创建的结果集是数据集类型(不是对象),我需要直接转换为数据表或先转换为对象,然后再转换为数据表。是我的问题
    【解决方案3】:

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

    【讨论】:

    • 我无法使用它,因为我的 resultSet 变量属于数据集类型。错误消息“对象不是 ADODB.RecordSet 或 ADODB.Record。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多