在充当目标的SSIS脚本组件中动态获取列名

时间:2019-05-01 12:26:38

标签: c# ssis

好的,我正在使用SSIS脚本组件作为目标写入avro文件。由于AVRO也需要模式,因此我需要定义模式。当我手动定义架构时,它可以正常工作。但是我有10到12个数据流任务,并且我不想显式地编写模式。我正在尝试查看是否可以使用自动生成的BufferWrapper,以查看是否可以从中读取内容,但无法读取,并且始终返回空白。

我尝试过发布here的解决方案,还阅读了this。 但是一切都变成空白。

我也遇到过this。可能是原因,如果答案中的解释正确无误,这是不可能的吗?

所以,在我的 公共重写void PreExecute(),我有这样的东西:

Schema = @"{
                        ""type"":""record"",
                        ""name"":""Microsoft.Hadoop.Avro.Specifications.Counterparts"",
                        ""fields"":
                            [
                               { ""name"":""CounterpartID"", ""type"":""int"" },
                               { ""name"":""CounterpartFirstDepositDate"",  ""type"":[""string"",""null""] },
                               { ""name"":""CounterpartFirstTradeDate"",""type"":[""string"",""null""] },
                               { ""name"":""ClientSegmentReportingID"",""type"":[""int"",""null""] },
                               { ""name"":""ClientSegmentReportingName"", ""type"":[""string"",""null""] },
                               { ""name"":""ContractID"", ""type"":[""int"",""null""] },
                               { ""name"":""ContractFirstDepositDate"", ""type"":[""string"",""null""] },
                               { ""name"":""ContractFirstTradeDate"",""type"":[""string"",""null""] },
                               { ""name"":""ContractClosingOffice"",""type"":[""string"",""null""] },
                               { ""name"":""LeadCreationDate"", ""type"":[""string"",""null""] },
                               { ""name"":""ContractCountryOfResidence"", ""type"":[""string"",""null""] }
                            ]
                    }";

}

我正在检查是否可以从BufferWrapper中生成它,而不是手动定义所有这种模式,但这将返回空白:

var fields = typeof(Input0Buffer).GetFields().Select(m => new
{
    Name = m.Name,
    Type = m.FieldType
}).ToList();

此外,如果我只是这样做,那还会返回空白

类型myType = typeof(Input0Buffer);

// Get the fields of the specified class.
FieldInfo[] myField = myType.GetFields();

我之前将这些新方法放在Pre-Execute中,但是后来想,也许那个缓冲区还没有被初始化,所以我将其移到Input0_ProcessInputRow方法中,并确保使用计数器变量仅触发一次它,此代码仅在counter = 0时运行,即使返回空也是如此。

public override void Input0_ProcessInputRow(Input0Buffer Row)
{

    if (counter == 0)
    {
        Type myType = typeof(Input0Buffer);

        // Get the fields of the specified class.
        FieldInfo[] myField = myType.GetFields();
     }
  //Processing logic
 }

难道不是因为this吗?

谈到它是受保护的,并且也无法从该自动生成的类外部进行访问。

1 个答案:

答案 0 :(得分:1)

我终于在这里找到了答案:https://waheedrous.wordpress.com/2014/02/24/ssis-global-replace-for-all-columns-using-a-script-component/

我最终可以从脚本组件中获取列和数据类型的列表。我只会在第一次运行(使用计数器变量)。