在脚本转换中为多个input列应用行转换

我试图导入已合并单元格的SSIS中的Excel文件,并且SSIS将这些合并单元格读取为除具有数据的第一个单元格之外的NULL。

我试图parsing的信息,为此,我想将合并的单元格数据应用到以前合并的每个单元格。

我有这个代码,我发现,将代码应用到F1列(在我的input)

// This script adjusts the value of all string fields using System; using System.Data; using Microsoft.SqlServer.Dts.Pipeline.Wrapper; using Microsoft.SqlServer.Dts.Runtime.Wrapper; [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] public class ScriptMain : UserComponent { string filledField1 = ""; public override void Input0_ProcessInputRow(Input0Buffer Row) { // Check if the value is null if (Row.F1_IsNull) { // If null => replace value by variable Row.F1 = filledField1; } else { // If not null => replace variable by value filledField1 = Row.F1; } } } 

我想要的是通过foreach循环将这个代码应用于多个列,但是我只能在先知道列的名称的情况下才能这样做。

我怎样才能转换这段代码来应用每一列的每一行而不是只有F1列的转换?

你不能生成它。 如果有人不知道,我会很乐意删除这个,并奖励他们的答案。

为什么它不能做到这一点是在你的Input0_ProcessInputRow方法,在ScriptMain类,接受一个Input0Buffer作为参数。 Input0Buffer是一个自动生成的类。 以下注释将定义InputOBuffer类的BufferWrapper.cs文件

 /* THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT! * Microsoft SQL Server Integration Services buffer wrappers * This module defines classes for accessing data flow buffers * THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT! */ 

所以,这个类就是在ProcessInputMethod中定义了可用的东西。 您单击“编辑脚本”button之前,它会为您select的所有列生成一组getter和/或setter方法以及一个IsNull方法。

Input0Buffer是从ScriptBuffer类派生的。 ScriptBuffer有它的定义

 namespace Microsoft.SqlServer.Dts.Pipeline { public class ScriptBuffer { protected PipelineBuffer Buffer; protected int[] BufferColumnIndexes; public ScriptBuffer(PipelineBuffer BufferToUse, int[] BufferColumnIndexesToUse, OutputNameMap OutputMap); protected object this[int ColumnIndex] { get; set; } protected void AddRow(); protected void DirectRow(string outputName); protected bool EndOfRowset(); protected bool IsNull(int ColumnIndex); protected bool NextRow(); protected void SetEndOfRowset(); protected void SetNull(int ColumnIndex); } } 

重要的是要注意,名为Buffer的PipelineBuffer实例在ScriptBuffer类中被定义为受保护的。 它没有被定义为我们自动生成的类中的任何东西,所以它不能在类定义之外访问。 这意味着当我们使用实例的时候,就像我们在ScriptMain中做的那样,我们不能碰到被保护的成员,因为他们的行为就像是私有的。

我相信你可以实现一个IEnumerable接口,这样你就可以在Input0Buffer类上做你想做的事情,但是知道每次打开脚本时,Visual Studio都会重新生成类并删除你的编辑。

当我input这个,我正在做一个笔记来检查如何扩展方法,因为他们可能提供一种方法…