2010-10-08 48 views
0

在SSIS 2005中,我正在使用FTP任务。我有一个流程,当程序包运行时,它从FTP检索特定文件夹中的任何文件到本地文件夹。在SSIS中的某些特定错误上继续流动

远程文件夹的路径是通过变量设置如/root/abc/*abc.txt

如果有文件,该文件夹中匹配此标准的任务工作正常。如果没有文件,则任务将失败,并显示文件未找到错误!

我该如何让SSIS不会中断任务,以防万一这个特定的文件没有找到错误出现,只是因为远程文件夹没有匹配的文件?

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

回答

0

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

步骤一步的过程:

  1. 在SSIS包,创建一个名为FTP Connection FTP 中所示屏幕截图#还创建变量。变量RemotePath包含FTP文件夹路径; LocalPath包含将文件下载到的文件夹; FilePattern包含文件模式以查找从FTP服务器下载的文件列表; FileName将由Foreach loop container填充,但为了避免FTP任务设计时出现错误,可以使用/DelayValidation属性将FTP任务填充为True

  2. 在SSIS包,地点如图截图#一个Script TaskForeach Loop containerFTP TaskForeach Loop container内。

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

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

  5. 配置在屏幕截图中所示的FTP Task为#和#6

  6. 截图#显示了样品包执行时没有匹配的文件被发现为图案*.txt

  7. 截图#示出了前执行包的文件夹C:\temp\的内容。

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

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

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

  11. 截图#示出了包装失败当与不正确远程路径提供。

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

希望有所帮助。

脚本任务代码:

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

使用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; 
} 

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

包括Imports声明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

钪reenshot#3:

3

截图#4:

4

截图#5:

5

截图#6:

6

截图#7:

7

截图#8:

8

截图#9:

9

截图#10:

10

截图#11:

11

截图#12:

12

截图#13:

13