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

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

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

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

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

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

【问题讨论】:

    标签: sql-server-2005 ssis ftp


    【解决方案1】:

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

    分步过程:

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

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

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

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

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

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

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

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

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

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

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

    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:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多