SSIS 脚本组件 - 遍历具有 NULL 值的列

SSIS Script Component - Iterate Through Columns with NULL Values

我正在使用以下 .NET 代码循环访问所有输入列以创建列的 HashByte 值,然后确定该行是否已更新。

脚本工作正常,直到列具有 NULL 值。如何在不使用 TRY CATCH 块的情况下编写代码?

Imports System.Text
Imports System.Reflection
Imports System.Security.Cryptography

Private sha As SHA256 = New SHA256CryptoServiceProvider() 'used To create the SHA256 hash

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    Try

        ' create hashbyte column to identify if row has changed

        Dim concat As StringBuilder = New StringBuilder("")

        ' loop over all the input columns of the buffer row 

        For Each col As PropertyInfo In Row.GetType().GetProperties()

            If Not col.Name.ToLower.EndsWith("isnull") AndAlso Not col.Name.ToLower.Equals("hash") Then
                MsgBox(col.Name.ToLower)
                If col.GetValue(Row, Nothing) Is Nothing Then
                    concat.Append("")
                Else
                    concat.Append(Convert.ToString(col.GetValue(Row).ToString()))
                End If

                concat.Append("|")
            End If

        Next

        Dim sHashBytes As String = concat.ToString().Remove(concat.ToString().Length - 1) ' remove the last character of the string
        Dim bHashBytes As Byte() = sha.ComputeHash(System.Text.UnicodeEncoding.Unicode.GetBytes(sHashBytes))
        Dim sb As StringBuilder = New StringBuilder("")

        For i As Integer = 0 To bHashBytes.Length - 1
            sb.Append(bHashBytes(i).ToString("X2"))
        Next

        Row.Hash = "0x" & sb.ToString()

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

谢谢,格雷格

好吧,假设所有输入列都是 String 类型。我 post 一段代码,它将所有字符串列连接成一个字符串(在 C# 中)以进行省略的计算。

public override void ProcessInput(int InputID, PipelineBuffer Buffer)
{
  bool fireAgain = true;
  string columnData = null;

  while (Buffer.NextRow())
  {
    for (int columnIndex = 0;
      columnIndex < Buffer.ColumnCount;
      columnIndex++)
    {

      if (!Buffer.IsNull(columnIndex))
      {
        BufferColumn columnInfo = Buffer.GetColumnInfo(columnIndex);
        switch (columnInfo.DataType)
        {

          // check column data type
          case DataType.DT_WSTR:
            columnData += Buffer.GetString(columnIndex);
            break;

          // add code to support more data types here

          default:
            columnData = "";
            break;
        }
      }
    }
  }
  // Do some calculations...
  base.ProcessInput(InputID, Buffer);
}

调用 ProcessInput 而不是 Input0_ProcessInputRow 的原因 - 在后者中,所有列都具有列命名的属性,因此无法遍历它们。每个缓冲区都会调用此方法,因此您拥有的模式数据(和缓冲区),您收到的调用越多。
调用 base.ProcessInput(InputID, Buffer) 对于正确的缓冲区处理、标记它已处理并可用于进一步的数据流转换是必不可少的。

受 Todd McDermid 的 Blog post 启发。