循环 SSIS 脚本组件中的列

问题描述 投票:0回答:2

我有一个 BIDS 项目设置,用于将数据从多个平面文件上传到 SQL Server 2008 数据库。数据由另一个组织提供。

许多数据都有尾随或前导空格。这已经是一个足够大的问题了,需要我更改表中列的大小来适应。我可以使用派生列来解决此问题,但列太多,手动设置这一切是不切实际的。

我正在尝试使用脚本组件(转换)在上传之前删除每个字段的前导和尾随空格。然而,这是我第一次尝试使用脚本组件,但运气不佳。

尝试一个简单的 foreach 循环:

foreach(DataColumn i in Row)
  {
      /* do something */
  }

给我一个错误,“foreach 语句无法对‘Input0Buffer’类型的变量进行操作,因为‘Input0Buffer’不包含‘GetEnumerator’的公共定义。我需要做什么来解决这个问题?

c# ssis-2008
2个回答
8
投票
脚本组件中的

Row
不是
System.Data.DataRow
,而是
Input0Buffer
Input0Buffer
直接从您的 ssis 包派生,并将列名称作为属性。

因此您可以使用 GetType().GetProperties() 获取对象上的所有 System.Reflection.PropertyInfo 并通过它们执行您想要的操作。尽管您必须对如何使用系统反射实际动态调用属性来修改内容进行一些研究,因为我不知道我的脑海中的答案。

using System.Linq;

var properties = Row.GetType().GetProperties().Where(p => !p.Name.EndsWith("_IsNull")).Select(p => p.Name).ToArray();
foreach (var p in properties)
{
    //Do Something
}

0
投票

有人用另一种方式做到了,请参阅在脚本转换中对多个输入列应用行转换

您实际上可以访问脚本中的底层对象并迭代缓冲区,而无需使用命名列。您需要继承缓冲区并在 public override void ProcessInput(int InputID, string InputName, PipelineBuffer Buffer, OutputNameMap OutputMap) 中使用这个继承的类。我通常使用从 Input0Buffer 继承的类(自动生成的类),这样我就可以访问命名列和可迭代列。您可以使用反射获取列的索引,例如:

//inherit via BufferWrapper 
   public class Input0ByIndexBuffer : Input0Buffer

然后,通过更改以下内容似乎可以循环遍历 Row 对象的所有列:

public override void Input0_ProcessInputRow(Input0Buffer Row)

自写:

public void Input0_ProcessInputRow(Input0ByIndexBuffer Row)

这个自写的

Input0ByIndexBuffer
可以让你一次性搞定所有栏目。它看起来像是一个很大的代码,但它只是
Input0Buffer
类的副本,并进行了所需的小更改,以便所需的属性不再受保护,如果我没看错的话。

尽管两个答案都是关于同一件事,但它们并不重复,因为它们没有相同的标签。

© www.soinside.com 2019 - 2024. All rights reserved.