我有一个程序包,可以循环多个平面文件,并使用脚本组件对其进行解析,然后将其放入我的数据库中。这个想法是包指向一个共享文件夹并遍历所有文件。如果成功导入了数据,程序包将随后删除该文件。一旦foreach循环为空(所有文件均已成功导入),程序包将删除目录中的所有内容,以防程序包没有循环通过任何不需要的文件/目录。
目前,我的控制流程如下所示:
我的数据流如下所示(请忽略警告,这只是可能的截断错误):
现在,如果我的任何任务失败了,我希望将文件移动到另一个目录,以便可以导入其余文件,并在以后处理故障文件。
我的事件处理程序是一个文件系统任务集,用于移动文件OnTaskFailed。这是针对我的软件包的整个范围设置的。当执行一个我知道会导致文件失败的文件包时,我收到以下错误消息:
[File System Task] Error: An error occurred with the following error message: "The process cannot access the file ' \UNCpath\filepath\file.txt' because it is being used by another process.".
如何解锁该文件,以便在出错时将其移动到另一个文件夹?我在文件系统任务上将延迟验证设置为true。我还尝试过包括一个脚本组件,该组件使程序包在尝试移动它之前要等待十秒钟。我不知道还有哪些其他进程正在使用该文件。
如果还有其他更好的方法来处理我要完成的工作,则我欢迎任何建议。
最佳答案
问题在于,循环处于 Activity 状态时,循环文件系统任务会保存OS文件句柄,因此您无法删除或移动它们。您将必须将文件移动逻辑从“移动”转换为“复制”(内部循环)和“删除”(外部循环)。
创建一个遵循数据流任务错误结果的流,然后将失败的文件复制到失败的文件目标。然后,您的空目录任务将处理删除。
关于sql-server - SSIS无法在OnTaskFailed事件处理程序上移动文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49492782/