我正在尝试将所有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
有人可以帮我吗?
答案 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告诉我们)。这可能会引起一些混乱,可能会导致编码错误。