继续在SSIS中的某个特定错误上流动

时间:2010-10-08 10:17:39

标签: sql-server-2005 ssis ftp

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

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

如果该文件夹中的文件符合此条件,则任务正常。如果没有文件,则任务失败且找不到文件错误!

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

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

1 个答案:

答案 0 :(得分:0)

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

分步流程:

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

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

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

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

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

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

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

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

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

  10. 屏幕截图# 11 显示执行

  11. 后文件夹C:\temp\ 的内容。

  12. 屏幕截图# 12 显示提供错误远程路径时的程序包失败。

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

  14. 希望有所帮助。

    脚本任务代码:

    可以在 SSIS 2008 and above 中使用的

    C#代码。

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

    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;
    }
    
    可以在 SSIS 2005 and above 中使用的

    VB 代码。

    包含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:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

    屏幕截图#9:

    9

    屏幕截图#10:

    10

    屏幕截图#11:

    11

    屏幕截图#12:

    12

    屏幕截图#13:

    13