继续处理 SSIS 中的某些特定错误

Posted

技术标签:

【中文标题】继续处理 SSIS 中的某些特定错误【英文标题】:Continue flow on certain specific Error in SSIS 【发布时间】:2010-10-08 10:17:39 【问题描述】:

在 SSIS 2005 中,我使用的是 FTP 任务。我有一个流程,当包运行时,它会将特定文件夹中的任何文件从 FTP 检索到本地文件夹。

远程文件夹路径由/root/abc/*abc.txt等变量设置

如果该文件夹中有符合此条件的文件,则该任务可以正常工作。如果没有文件,任务将失败并出现文件未找到错误!

如果只是因为远程文件夹没有匹配的文件而出现此特定文件未找到错误,我如何才能使 SSIS 不中断任务?

但是,如果出现 FTP 服务器无法登录等错误,那么任务应该会抛出预期的错误。

【问题讨论】:

【参考方案1】:

您现在可能已经找到了问题的答案。这是实现这一目标的一种可能方法。 Script Task 可用于查找给定模式的 FTP 文件夹路径中存在的文件列表(例如 *.txt)。下面的例子展示了如何做到这一点。

分步过程:

    在 SSIS 包上,创建一个名为 FTPFTP Connection,并创建 5 变量,如屏幕截图 #1 所示.变量RemotePath 包含FTP 文件夹路径; LocalPath 包含文件将下载到的文件夹; FilePattern 包含文件模式,用于查找要从 FTP 服务器下载的文件列表; FileName 将由 Foreach loop container 填充,但为避免 FTP 任务设计时错误,可以使用 / 填充它,或者可以将 FTP 任务上的 DelayValidation 属性设置为 是的

    在 SSIS 包上,将 Script TaskForeach Loop containerFTP Task 放在 Foreach Loop container 中,如屏幕截图 #2 所示。

    Script Task 中的Main() 方法替换为脚本任务代码 部分下的代码。 Script Task 将使用匹配给定模式的文件集合填充变量 ListOfFiles。此示例将首先使用模式 *.txt,它不会产生任何结果,然后是模式 *.xls,它将匹配 FTP 服务器上的少数文件。

    如屏幕截图 #3 和 #4 所示配置 Foreach Loop container。此任务将循环通过变量 **ListOfFiles*。如果没有文件,循环容器内的 FTP 任务将不会执行。如果有文件,则循环容器内的 FTP 任务将针对在 FTP 服务器上找到的文件数执行该任务。

    如屏幕截图 #5 和 #6 所示配置FTP Task

    屏幕截图 #7 显示了当 no 为模式 *.txt 找到匹配文件时的示例包执行。

    屏幕截图#8显示了文件夹C:\temp\执行包之前的内容。

    屏幕截图 #9 显示了为模式 *.xls 找到匹配文件时执行的示例包。

    截图#10显示了FTP远程路径/Practice/Directory_New的内容。

    屏幕截图#11显示执行包后文件夹C:\temp\的内容。

    屏幕截图 #12 显示了在提供不正确的远程路径时包失败。

    屏幕截图 #13 显示了与包失败相关的错误消息。

希望对您有所帮助。

脚本任务代码:

C# 代码可以在 SSIS 2008 and above 中使用。

包含using 语句使用 System.Text.RegularExpressions;

public void Main()

    Variables varCollection = null;
    ConnectionManager ftpManager = null;
    FtpClientConnection ftpConnection = null;
    string[] fileNames = null;
    string[] folderNames = null;
    System.Collections.ArrayList listOfFiles = null;
    string remotePath = string.Empty;
    string filePattern = string.Empty;
    Regex regexp;
    int counter;

    Dts.VariableDispenser.LockForWrite("User::RemotePath");
    Dts.VariableDispenser.LockForWrite("User::FilePattern");
    Dts.VariableDispenser.LockForWrite("User::ListOfFiles");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    try
    
        remotePath = varCollection["User::RemotePath"].Value.ToString();
        filePattern = varCollection["User::FilePattern"].Value.ToString();

        ftpManager = Dts.Connections["FTP"];
        ftpConnection = new FtpClientConnection(ftpManager.AcquireConnection(null));
        ftpConnection.Connect();
        ftpConnection.SetWorkingDirectory(remotePath);
        ftpConnection.GetListing(out folderNames, out fileNames);
        ftpConnection.Close();

        listOfFiles = new System.Collections.ArrayList();
        if (fileNames != null)
        
            regexp = new Regex("^" + filePattern + "$");
            for (counter = 0; counter <= fileNames.GetUpperBound(0); counter++)
            
                if (regexp.IsMatch(fileNames[counter]))
                
                    listOfFiles.Add(remotePath + fileNames[counter]);
                
            
        

        varCollection["User::ListOfFiles"].Value = listOfFiles;
    
    catch (Exception ex)
    
        Dts.Events.FireError(-1, string.Empty, ex.ToString(), string.Empty, 0);
        Dts.TaskResult = (int) ScriptResults.Failure;
    
    finally
    
        varCollection.Unlock();
        ftpConnection = null;
        ftpManager = null;
    

    Dts.TaskResult = (int)ScriptResults.Success;

VB 代码,可以在 SSIS 2005 and above 中使用。

包含Imports 语句导入 System.Text.RegularExpressions

Public Sub Main()
    Dim varCollection As Variables = Nothing
    Dim ftpManager As ConnectionManager = Nothing
    Dim ftpConnection As FtpClientConnection = Nothing
    Dim fileNames() As String = Nothing
    Dim folderNames() As String = Nothing
    Dim listOfFiles As Collections.ArrayList
    Dim remotePath As String = String.Empty
    Dim filePattern As String = String.Empty
    Dim regexp As Regex
    Dim counter As Integer

    Dts.VariableDispenser.LockForRead("User::RemotePath")
    Dts.VariableDispenser.LockForRead("User::FilePattern")
    Dts.VariableDispenser.LockForWrite("User::ListOfFiles")
    Dts.VariableDispenser.GetVariables(varCollection)

    Try

        remotePath = varCollection("User::RemotePath").Value.ToString()
        filePattern = varCollection("User::FilePattern").Value.ToString()

        ftpManager = Dts.Connections("FTP")
        ftpConnection = New FtpClientConnection(ftpManager.AcquireConnection(Nothing))

        ftpConnection.Connect()
        ftpConnection.SetWorkingDirectory(remotePath)
        ftpConnection.GetListing(folderNames, fileNames)
        ftpConnection.Close()

        listOfFiles = New Collections.ArrayList()
        If fileNames IsNot Nothing Then
            regexp = New Regex("^" & filePattern & "$")
            For counter = 0 To fileNames.GetUpperBound(0)
                If regexp.IsMatch(fileNames(counter)) Then
                    listOfFiles.Add(remotePath & fileNames(counter))
                End If
            Next counter
        End If

        varCollection("User::ListOfFiles").Value = listOfFiles

        Dts.TaskResult = ScriptResults.Success

    Catch ex As Exception
        Dts.Events.FireError(-1, String.Empty, ex.ToString(), String.Empty, 0)
        Dts.TaskResult = ScriptResults.Failure
    Finally
        varCollection.Unlock()
        ftpConnection = Nothing
        ftpManager = Nothing
    End Try

    Dts.TaskResult = ScriptResults.Success
End Sub

屏幕截图 #1:

屏幕截图 #2:

截图#3:

屏幕截图 #4:

屏幕截图 #5:

屏幕截图 #6:

截图#7:

截图#8:

屏幕截图 #9:

屏幕截图 #10:

屏幕截图 #11:

屏幕截图 #12:

屏幕截图 #13:

【讨论】:

以上是关于继续处理 SSIS 中的某些特定错误的主要内容,如果未能解决你的问题,请参考以下文章

SSIS 数据流脚本任务错误处理

有没有办法在每个 SSIS 包之前和之后启动存储过程?

sql SQL查询SSISDB以查找与特定SSIS包相关的错误消息

SSIS:特定查找的奇怪问题

SSIS包中的错误将数据加载到azure数据仓库中

在SSIS中导入CSV:截断错误