如果文件不存在,尝试使我的SSIS继续运行

时间:2019-05-02 19:39:21

标签: c# visual-studio ssis

因此,我正在运行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 :(得分:0)

尝试对每个可以处理的文件在文件上使用foreach循环,然后将文件的所有处理放入其中。并且不要在foreach循环之间放置任何优先约束。

这将处理没有其他文件的文件。

foreach循环本质上是检查文件是否存在。

这假定您不需要所有文件来正确处理它们。

答案 1 :(得分:0)

为什么在编写脚本之前不检查文件是否存在:

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);   

}