SSIS无法在OnTaskFailed事件处理程序上移动文件

时间:2018-03-26 13:34:42

标签: sql-server error-handling ssis

我有一个包通过多个平面文件循环,用脚本组件解析它们并将它们导入我的数据库。这个想法是包指向共享文件夹并循环遍历所有文件。如果数据已成功导入,则程序包将删除该文件。一旦foreach循环为空(所有文件都成功导入),程序包将删除目录的所有内容,以防程序包没有循环通过的任何不需要的文件/目录。 目前我的控制流程如下:

Control Flow

我的数据流看起来像这样(请忽略警告,这只是可能的截断错误):

Data Flow

现在,如果我的任何任务失败,我希望将我的文件移动到另一个目录,以便可以导入其余文件,以后可以处理故障文件。 我的事件处理程序是一个文件系统任务集,用于移动文件OnTaskFailed。这是为我的包的整个范围设置的。使用我知道的文件执行包会导致它失败时,我收到以下错误消息:

  

[文件系统任务]错误:出现以下错误消息时出错:"进程无法访问文件' \ UNCpath \文件路径\ file.txt的'因为它正被另一个进程使用。"。

如何解锁此文件,以便错误时将其移至另一个文件夹?我在文件系统任务上将延迟验证设置为true。我还尝试了一个脚本组件,使得程序包在尝试移动之前等待十秒钟。我不知道其他进程正在使用该文件。

如果有任何其他更好的方法来处理我想要完成的事情,我愿意接受任何建议。

2 个答案:

答案 0 :(得分:1)

问题是循环文件系统任务在循环处于活动状态时保存OS文件句柄,因此您无法删除或移动它们。您必须从"移动"转换文件移动逻辑。到"复制" (内循环)和"删除" (外循环)。

创建一个遵循数据流任务错误结果的流,并将失败的文件复制到失败的文件目标。然后您的空目录任务将处理删除。

答案 1 :(得分:1)

找出文件锁定的原因。在我的代码中,我使用了以下内容:

 var lines = File.ReadAllLines(filepath);

一个foreach循环,它将遍历文档的每一行。问题是,File.ReadLines将文件锁定到位并逐行读取。因此,当我的代码抛出错误时,File.ReadLines阻止它被移动。

要解决此问题,我将代码更改为:

Contact Form 7

这会将所有文本存储到内存中,因此不再需要将文件锁定到位。它可能表现不佳,但我宁愿更安全的错误处理。