Как избежать задачи FTP SSIS от сбоя, когда нет никаких файлов для загрузки?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
18
задан thursdaysgeek 26 July 2011 в 17:00
поделиться

7 ответов

Проверьте этот ссылка , который описывает о корректной обработке ошибки задачи в Пакете SSIS.

у меня была почти та же проблема, но с получением файлов. Я хотел, чтобы пакет НЕ перестал работать, когда никакие файлы не были найдены на FTP-сервере. Вышеупомянутая ссылка заделывает ошибку, пузырясь и заставляя пакет перестать работать; что-то Вы думали бы FailPackageOnError=false, должно было сделать? :-S

Hope это решает его для Вас также!

14
ответ дан 30 November 2019 в 07:23
поделиться

(Я не могу принять свой собственный ответ, но это было решением, которое работало на меня.)

Это не может быть лучшее решение, но это работает.

я использую задачу сценария и имею набор переменных для получения информации о соединении FTP, и источник и целевые каталоги. (Поскольку, мы будем изменять сервер, на этом работают, и будет легче измениться в пакете конфигурации.)

я создаю текстовый файл на лету и пишу команды ftp в него:

    Dim ftpStream As StreamWriter = ftpFile.CreateText()
    ftpStream.WriteLine(ftpUser)
    ftpStream.WriteLine(ftpPassword)
    ftpStream.WriteLine("prompt off")
    ftpStream.WriteLine("binary")
    ftpStream.WriteLine("cd " & ftpDestDir)
    ftpStream.WriteLine("mput " & ftpSourceDir)
    ftpStream.WriteLine("quit 130")
    ftpStream.Close()

Затем после предоставления его достаточно времени для реального закрытия я запускаю процесс, чтобы сделать команду ftp:

    ftpParameters = "-s:" & ftpParameterLoc & ftpParameterFile & " " & ftpServer
    proc = System.Diagnostics.Process.Start("ftp", ftpParameters)

Затем после предоставления его еще некоторое время для ftp обрабатывает для выполнения, я удаляю временный файл ftp (который имеет информацию о соединении в нем!).

, Если файлы не существуют в исходном каталоге (переменная имеет \\drive\dir\*.* отображающийся), то нет никакой ошибки. Если некоторая другая ошибка происходит, задача все еще перестала работать, как она должна.

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

, Поскольку я указал, у меня нет способа знать то, чем файлы называют, или даже если существуют какие-либо файлы там вообще. Если они там, я хочу получить их.

3
ответ дан 30 November 2019 в 07:23
поделиться

У меня нет упакованного ответа для Вас, но так как никто больше ничего еще не отправил...

необходимо смочь установить переменную в задаче сценария ActiveX и затем использовать это, чтобы решить, должна ли задача FTP работать. Существует пример здесь , который работает с локальными путями. Надо надеяться, можно адаптировать понятие (или, если возможно, подключите диск FTP и сделайте это тот путь).

1
ответ дан 30 November 2019 в 07:23
поделиться

Поместите его в контейнер ForEach, который выполняет итерации по файлам для загрузки. Никакие файлы, никакой FTP, никакой отказ.

0
ответ дан 30 November 2019 в 07:23
поделиться

Можно перенаправить при отказе к другой задаче, которая ничего не делает, т.е. сценария, который просто возвращает true.

, Чтобы сделать это, добавьте новую задачу сценария, выделите свою задачу FTP, второй зеленый коннектор появится, перетащить это к задаче сценария и затем дважды щелкнуть по ней. Выберите Отказ на выпадающем Значении. Очевидно, необходимо будет затем обработать реальные отказы в этой задаче сценария все еще отобразиться прямо в истории Job.

0
ответ дан 30 November 2019 в 07:23
поделиться

Ага, хорошо - спасибо за разъяснение. Поскольку задача FTP не может возвратиться, папка, перечисляющая ее, не будет возможна использовать ForEach, поскольку я первоначально сказал - Который только работает, если Вы загружаете X сумм файлов к удаленному источнику.

Для загрузки X сумм файлов можно пойти двумя путями, или можно сделать это полностью в .NET в задаче сценария, или можно заполнить ArrayList с именами файлов из задачи сценария .NET, затем ForEach по ArrayList, передав имя файла переменной и загрузив то имя переменной в стандартной задаче FTP.

Пример кода для удовлетворения: http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=2472491&SiteID=1

Так, в вышеупомянутом, Вы получили бы FileNames () и заполнили бы ArrayList от этого, затем присвоили бы ArrayList переменной Типа объекта в Dts. Переменные, затем ForEach по тому Объекту (ArrayList) переменное использование кода что-то как: http://www.sqlservercentral.com/articles/SSIS/64014/

0
ответ дан 30 November 2019 в 07:23
поделиться

Вы можете использовать бесплатную задачу SSIS FTP Task ++ от eaSkills. Он не выдает ошибку, если файл или файлы не существуют, он поддерживает подстановочные знаки и дает вам возможность загружать и удалять, если вам это нужно.

Вот ссылка на страницу функции: http://www.easkills.com/ssis/ftptask

0
ответ дан 30 November 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: