2

我有一个 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
4

2 回答 2

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
于 2012-11-06T16:25:18.180 回答
1

确保您已为数据流任务创建了平面文件源。如果您没有现有的,请创建一个临时的,作为您通过 For Each 循环提供的文件路径的占位符。

据我了解,您应该将要导入平面文件连接的每个文件的路径传递给您。这可以通过将 For Each 循环中生成的变量添加为平面文件连接的 Expression 属性中的表达式来轻松完成。


更新:

您需要在 Do ... Loop 中设置条件。例如:Loop While Not bolFinished。查看此文档以获取更多信息。

于 2012-11-03T23:17:09.650 回答