Продолжить поток при определенной конкретной ошибке в службах SSIS

В SSIS 2005 я использую задачу FTP. У меня есть поток, в котором при запуске пакета он извлекает любые файлы в определенной папке с FTP в локальную папку.

Путь к удаленной папке задается переменной, такой как /root/abc/*abc.txt.

Задача работает нормально, если в этой папке есть файлы, соответствующие этому критерию. Если файлов нет, задача завершается с ошибкой файл не найден!

Как я могу заставить SSIS не прерывать задачу, если эта конкретная ошибка не найдена возникает просто потому, что в удаленной папке нет соответствующих файлов?

Но в случае возникновения ошибки, такой как FTP-сервер не может войти в систему и т. д., задача должна выдать ожидаемую ошибку.


person Saurabh Kumar    schedule 08.10.2010    source источник


Ответы (1)


Возможно, вы уже нашли ответ на свой вопрос. Вот один из возможных способов достижения этого. Script Task можно использовать для поиска списка файлов, присутствующих в пути к папке FTP для заданного шаблона (скажем, *.txt). Пример ниже показывает, как это можно сделать.

Пошаговый процесс:

  1. В пакете SSIS создайте FTP Connection с именем FTP, а также создайте 5 переменных, как показано на снимке экрана №1. Переменная RemotePath содержит путь к папке FTP; LocalPath содержит папку, в которую будут скачиваться файлы; FilePattern содержит шаблон файла для поиска списка файлов для загрузки с FTP-сервера; FileName будет заполнен значением Foreach loop container, но во избежание ошибки времени разработки задачи FTP его можно заполнить с помощью / или для свойства DelayValidation задачи FTP можно установить значение True.

  2. В пакете SSIS поместите Script Task, Foreach Loop container и FTP Task в Foreach 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 показано содержимое папки 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 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

person Community    schedule 06.06.2011