SSIS проверяет перечислитель файлов Foreach

У меня есть проект ssis, для начала у меня есть перечислитель файлов Foreach, и внутри него несколько задач. Он работает безупречно при нормальных обстоятельствах, однако, если в каталоге перечислителя нет файла, возникает ошибка, вопрос в том, как я могу выполнить проверку или что-то еще, чтобы избежать ошибки во время выполнения? Спасибо

img ссылки

ssis http://s15.postimage.org/l41py15aj/ssis.png ошибка http://s15.postimage.org/rj0qupc0b/ssiserror.png


person anonymous1110    schedule 04.12.2012    source источник
comment
также есть ли способ проверить, существует ли каталог? Благодарю.   -  person anonymous1110    schedule 04.12.2012


Ответы (3)


У вас может быть задача сценария перед циклом Foreach, который в основном проверяет файлы и каталоги. Затем есть ограничение приоритета, чтобы остановить пакет, если каталог или файлы отсутствуют .

Создайте 3 переменные

 Name        DataType   
 Directory   String
 Files       String
 Exists      int

В задаче сценария просто проверьте, присутствует ли каталог вместе с файлами. Вы можете изменить код, если вам нужно даже перечислить подпапки или проверить, присутствуют ли в папке определенные файлы.

if (Directory.Exists(Dts.Variables["User::Files"].Value.ToString()))
{
if (Directory.GetFiles(Dts.Variables["User::Files"].Value.ToString()).Length != 0)
    {
      Dts.Variables["User::Exists"].Value = 1;
     }
            else
            {
                Dts.Variables["User::Exists"].Value = 0;
            }
        }
        else 
        {
            Dts.Variables["User::Exists"].Value = 0;
        } 

В ограничении приоритета проверьте значение переменной Exists

    Evaluation operation : Expression
    Expression           : @Exists==1 

Обновлять :

В редакторе скриптовых задач нужно добавить переменные в секцию ReadOnlyVariable тега скрипта

person praveen    schedule 04.12.2012
comment
привет, я получаю сообщение об ошибке: System.Reflection.TargetInvocationException: цель вызова выдала исключение. ---› Microsoft.SqlServer.Dts.Runtime.DtsRuntimeException: элемент не может быть найден в коллекции. Эта ошибка возникает, когда вы пытаетесь получить элемент из коллекции в контейнере во время выполнения пакета, а элемента там нет. - person anonymous1110; 04.12.2012

Я бы установил выражение для Disable of the Sql Task, чтобы подтвердить, действительно ли имя файла.

У меня нет SSIS здесь, но я посмотрю.

person Preet Sangha    schedule 04.12.2012
comment
привет, я пытался сделать это, однако, поскольку переменная имени файла заполняется после перечислителя цикла foreach, она всегда будет возвращать значение null, поскольку условие начнется сначала перед циклом for, верно? - person anonymous1110; 04.12.2012

Вы знаете об этом конкретном случае, когда возникает ошибка, и вы хотите ее обработать. Что, если он выйдет из строя из-за какой-то другой непредвиденной ошибки?

Всегда добавляйте обработчик событий OnError.

Теперь, после обработки вашего состояния ошибки с помощью обработчика событий, вы можете выбрать распространение этой ошибки для сбоя задачи (что является поведением по умолчанию) или вы можете установить системную переменную Распространить в своем ' Обработчик события OnError на false. Это позволит остальной части кода после For Each работать как обычно.

person user1826905    schedule 04.12.2012