我有一个SSIS包(SQL Server 2005),它循环遍历文件夹中的一堆平面文件。我需要等到源应用程序完成文件编写之后才能在平面文件导入任务中打开它。
我有一个For Each循环容器,其中包含一个在数据流任务之前执行的脚本任务。
当我尝试在脚本任务和数据流任务之间创建成功连接器时,我收到此错误:
无法创建连接器。对象引用未设置为实例 一个对象。
我知道某些东西被置之不理,但我看不到它。我在脚本任务和数据流任务上都将DelayValidation
设置为true。我还缺少什么?
我是C#家伙所以也许我错过了VB中显而易见的东西。这是我从互联网上挖走的脚本:
Public Sub Main()
Dim strFileName As String = CType(Dts.Variables("FileName").Value, String)
Dim objFS As System.IO.FileStream
Dim bolFinished As Boolean = False
Do
Try
objFS = System.IO.File.Open(strFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
bolFinished = True
objFS.Close()
Catch ex As Exception
System.Threading.Thread.Sleep(1000)
End Try
Loop
If bolFinished Then
Dts.TaskResult = Dts.Results.Success
Else
Dts.TaskResult = Dts.Results.Failure
End If
End Sub
答案 0 :(得分:3)
Milen k不仅仅是对的。看起来你有一个无限循环,它会打开一个文件几次,直到它崩溃。
您可以使用以下建议的代码更改您的代码。这将帮助您摆脱无限循环。
Do
Try
objFS = System.IO.File.Open(strFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
bolFinished = True
objFS.Close()
Catch ex As Exception
System.Threading.Thread.Sleep(1000)
End Try
Loop
Do While(true)
Try
objFS = System.IO.File.Open(strFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)
bolFinished = True
objFS.Close()
Exit Do
Catch ex As Exception
System.Threading.Thread.Sleep(1000)
End Try
Loop
答案 1 :(得分:1)
确保为数据流任务创建了平面文件源。如果您没有现有的那个,请创建一个临时的,作为通过For Each循环提供它的文件路径的占位符。
据我所知,您应该将路径传递给您将要导入平面文件连接的每个文件。这可以通过将For Each循环中生成的变量添加为平面文件连接的Expression属性中的表达式来轻松完成。
您需要在Do ...循环中设置条件。例如:Loop While Not bolFinished
。请查看this document以获取更多信息。