【问题标题】:Why am I getting object reference not set error on script task connector?为什么我在脚本任务连接器上收到对象引用未设置错误?
【发布时间】:2025-12-25 05:00:11
【问题描述】:

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

【问题讨论】:

    标签: sql-server-2005 ssis


    【解决方案1】:

    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
    

    【讨论】:

    • 谢谢,我知道这很简单。自从我的原始帖子以来,我升级到 SQL 2012 并且能够在新的 SQL Server Data Tools 中使用 C#。开心多了!
    【解决方案2】:

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

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


    更新:

    您需要在 Do ... 循环中设置条件。例如:Loop While Not bolFinished。更多信息请查看this document

    【讨论】:

    • 文件名在 For Each 循环和数据流任务之间传递,并且循环完美运行。如果它恰好在源应用程序正在写入平面文件时运行,则会出现问题 - 它通过 FTP 提供,因此可能需要几分钟。我需要编写任务脚本以将 for 循环置于保持模式,直到文件完成写入。如果我正确理解上面的脚本,它应该从 Dim strFileName As String = CType(Dts.Variables("FileName").Value, String) 行获取路径/文件名。
    最近更新 更多