因此,我正在运行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;
}
研究它并没有真正的帮助,只是使我回到了现在。
答案 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);
}