Попытка заставить мою SSIS продолжать работать, если файл не существует - PullRequest
2 голосов
/ 02 мая 2019

Итак, я использую SSIS (через VS), и у меня есть два сегмента, которые вешают трубку, когда мои клиенты не отправляют точные файлы каждый день.У меня есть задача, которая удаляет старые файлы, а затем переименовывает текущие файлы в имя файла с _OLD в конце.

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

Пример: клиент отправляет в понедельник файлы: имена, адреса, оценки, школы. Тот же клиент во вторник отправляет: имена, адреса, школы

, поскольку файл оценок не 'Если он не существует, он все равно переименовывается в Grades_OLD, но SSIS завершается ошибкой.

Сценарии:

del Names_OLD.csv
bye

Это затем переходит к сценарию переименования:

ren Names.csv Names_OLD.csv
bye

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

У нас есть два сценария, которые генерируют архивные данные для обработки:

public void Main()
{
Dts.Variables["ARCHIVEFILE"].Value = Path.GetFileNameWithoutExtension(Dts.Variables["FTPFILE"].Value.ToString()) + "_OLD" + Path.GetExtension(Dts.Variables["FTPFILE"].Value.ToString());
Dts.TaskResult = (int)ScriptResults.Success;
}

и

public void Main()
{
/*PSFTP_DEL_script.txt
del %1
bye

PSFTP_REN_script.txt
ren %1 %2
bye
*/

var lineOut = String.Empty;
var File1 = Dts.Variables["User::FTPWORKINGDIR"].Value.ToString() + "\\SSIS_PSFTP_DEL_script.txt";
var File2 = Dts.Variables["User::FTPWORKINGDIR"].Value.ToString() + "\\SSIS_PSFTP_REN_script.txt";

lineOut = "del " + Dts.Variables["User::ARCHIVEFILE"].Value.ToString() + Environment.NewLine + "bye";
System.IO.File.WriteAllText(File1, lineOut);

lineOut = "ren " + Dts.Variables["User::FTPFILE"].Value.ToString() + " " + Dts.Variables["User::ARCHIVEFILE"].Value.ToString() + Environment.NewLine + "bye";
System.IO.File.WriteAllText(File2, lineOut);            

Dts.TaskResult = (int)ScriptResults.Success;
}

Исследование этого действительно не дает ничего полезного, и отчасти просто возвращает меня туда, где я сейчас нахожусь.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Почему бы не проверить, существует ли файл перед написанием скрипта:

if (System.IO.File.Exists(Dts.Variables["User::ARCHIVEFILE"].Value.ToString())){

    lineOut = "del " + Dts.Variables["User::ARCHIVEFILE"].Value.ToString() + Environment.NewLine + "bye";
    System.IO.File.WriteAllText(File1, lineOut);

}

if (Dts.Variables["User::FTPFILE"].Value.ToString())){

    lineOut = "ren " + Dts.Variables["User::FTPFILE"].Value.ToString() + " " + Dts.Variables["User::ARCHIVEFILE"].Value.ToString() + Environment.NewLine + "bye";
    System.IO.File.WriteAllText(File2, lineOut);   

}
0 голосов
/ 02 мая 2019

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

Это будет обрабатывать файлы, которые находятся там, без сбоев, когда другие отсутствуют.

Цикл foreach по сути работает какпроверьте, существует ли файл.

Предполагается, что вам не нужны все файлы для их правильной обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...