2010-10-08 4 views
0

Dans SSIS 2005, j'utilise la tâche FTP. J'ai un flux où lorsque le paquet s'exécute, il récupère tous les fichiers dans un dossier spécifique de FTP vers un dossier local.Continuer le flux sur certaines erreurs spécifiques dans SSIS

chemin du dossier distant est définie par la variable telle que /root/abc/*abc.txt

La tâche fonctionne très bien s'il y a des fichiers dans ce dossier correspondant à ce critère. S'il n'y a pas de fichiers, la tâche échoue avec un fichier introuvable erreur!

Comment est-ce que je peux faire que SSIS ne casse pas la tâche au cas où cette erreur spécifique non trouvée de dossier monte parce que le dossier distant n'a aucun dossier correspondant? Mais, dans le cas où il y a une erreur telle que le serveur FTP ne peut pas se connecter, etc., la tâche devrait lancer l'erreur attendue.

Répondre

0

Probablement, vous avez trouvé une réponse à votre question maintenant. Voici une façon possible d'y parvenir. Script Task peut être utilisé pour trouver la liste des fichiers présents dans un chemin de dossier FTP pour un motif donné (disons *.txt). L'exemple ci-dessous montre comment cela peut être fait.

processus étape par étape:

  1. Sur le package SSIS, créez un FTP Connection nommé FTP et aussi créer des variables comme le montre la capture d'écran # 1 . La variable RemotePath contient le chemin du dossier FTP; LocalPath contient le dossier dans lequel les fichiers seront téléchargés; FilePattern contient le modèle de fichier pour trouver la liste des fichiers à télécharger à partir du serveur FTP; FileName sera complétée par la Foreach loop container mais pour éviter toute erreur de temps de conception des tâches FTP, il peut être rempli avec / ou la propriété DelayValidation sur la tâche FTP peut être réglé sur vrai.

  2. Sur le package SSIS, placez un Script Task, Foreach Loop container et FTP Task dans le Foreach Loop container comme indiqué dans les captures d'écran # 2 .

  3. Remplacer la méthode Main() dans le Script Task avec le code dans la section de code tâche de script . La tâche de script remplira la variable ListOfFiles avec la collection de fichiers correspondant à un modèle donné. Cet exemple utilisera d'abord le modèle * .txt, qui ne donne aucun résultat, puis le modèle * .xls qui correspondra à peu de fichiers sur le serveur FTP.

  4. Configurez le Foreach Loop container comme indiqué dans les captures d'écran # 3 et # 4 . Cette tâche parcourra la variable ** ListOfFiles *. S'il n'y a aucun fichier, la tâche FTP dans le conteneur de boucle ne s'exécutera pas. S'il y a des fichiers, la tâche FTP dans le conteneur de la boucle s'exécutera pour la tâche pour le nombre de fichiers trouvés sur le serveur FTP.

  5. Configurez le FTP Task comme indiqué dans les captures d'écran # 5 et # 6 .

  6. Screenshot # montre l'exécution du package exemple lorsque pas fichiers correspondants sont trouvés pour le modèle *.txt.

  7. Capture d'écran # 8 affiche le contenu du dossier C:\temp\avant exécution du package.

  8. Capture d'écran # montre l'exemple de l'exécution du package lorsque des fichiers correspondants sont trouvés pour le modèle *.xls.

  9. La capture d'écran # affiche le contenu du chemin FTP distant /Practice/Directory_New.

  10. Screenshot # montre le contenu du dossier C:\temp\après exécution du package.

  11. Capture d'écran # 12 montre la défaillance du paquet lorsqu'il est fourni avec incorrect chemin à distance.

  12. Capture d'écran # affiche le message d'erreur relatif à l'échec du package.

Espérons que ça aide.

Script code Tâche:

C# code qui peut être utilisé dans SSIS 2008 and above.

Incluez l'instruction usingà l'aide de 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 code qui peut être utilisé dans SSIS 2005 and above.

Incluez l'instruction ImportsImports 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 

écran # 1:

1

écran # 2:

2

Sc reenshot # 3:

3

écran # 4:

4

écran # 5:

5

écran # 6:

6

écran # 7:

7

écran # 8:

8

écran # 9:

9

écran # 10:

10

écran # 11:

11

Capture d'écran # 12:

12

Capture d'écran # 13:

13

Questions connexes