SSIS脚本任务组件将Input0Buffer写入文本文件

时间:2011-04-28 14:18:52

标签: vb.net ssis

我正在尝试将所有input0Buffer转储到txt文件,以结束使平面目标可重复使用的困难,因为我已经超过100个包,并且每个结构和列都不同。

我正在将错误行重定向到一个平面文件,所以在每个包中手动设置都是一个噩梦,所以我想编写整个输入而不指定Row.Name,所有这些都是文本文件。

我达到了这一点,我只得到一个专栏!它让我发疯了!

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports System.IO
Imports System.Reflection
Imports System.Xml
Imports Microsoft.SqlServer.Dts.Pipeline


<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute()> _
<CLSCompliant(False)> _
Public Class ScriptMain
  Inherits UserComponent

  Dim textWriter As StreamWriter
  Private inputBuffer As PipelineBuffer

  Public Overrides Sub ProcessInput(ByVal InputID As Integer, ByVal Buffer As Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer)
    inputBuffer = Buffer
    MyBase.ProcessInput(InputID, Buffer)
  End Sub

  Public Overrides Sub PreExecute()
    MyBase.PreExecute()
    textWriter = New StreamWriter( "c:\Test4.txt", True)
  End Sub

  Public Overrides Sub PostExecute()
    MyBase.PostExecute()
    textWriter.Close()
    ''
  End Sub

  Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    Dim delim As String = ", "

    Dim RowCount As Integer = 0

    For RowCount = 0 To inputBuffer.ColumnCount = -1
      If inputBuffer.Item(RowCount).ToString() = "" Then
        inputBuffer.Item(RowCount) = String.Empty
      End If
    Next

    textWriter.WriteLine(inputBuffer.Item(RowCount).ToString() & delim)

  End Sub

End Class

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

问题出在你写作的地方。你在For循环之外写作。循环遍历每一行并将条目的值设置为String.Empty,但是您没有在此处写入textWriter。按如下方式调整代码:

Dim myBuilder As New StringBuilder

For RowCount = 0 To inputBuffer.ColumnCount = -1
  If inputBuffer.Item(RowCount).ToString() = "" Then
    inputBuffer.Item(RowCount) = String.Empty
  End If
  myBuilder.Append(inputBuffer.Item(RowCount).ToString() & delim)
Next

textWriter.WriteLine(myBuilder.ToString)

这将确保每列都被写入。唯一的问题是你的最后一列后面会有一个分隔符。您可能希望在编写之前将其修剪掉。此外,您还需要在代码中添加Imports System.Text。

我想添加一个注释,因为它可能会引起一些混淆:当你执行计数列的行为时,你的循环计数器被称为RowCount(ColumnCount-1告诉我们)。这可能会引起一些混乱,可能会导致编码错误。