SSIS – 进程无法访问该文件,因为它正由另一个进程使用

我有以下Dataflow:

在此处输入图像描述

控制:

在此处输入图像描述

我只想将源文件夹中flatfiles的所有数据复制到sql数据库,并在复制后将这些文件移动到名为Done的文件夹中。

但是当我运行这个时,我得到错误:

[File System Task] Error: An error occurred with the following error message: "The process cannot access the file because it is being used by another process.". 

数据被复制到sqlserver,但文件不会移动。

我的进程选项卡如下:

在此处输入图像描述

这可能太明显了,但您是否尝试插入一个短暂的延迟来为数据流提供时间来释放文件? 例如,插入一个执行SQL任务,其内容如下:

 -- Wait for 1 second WAITFOR DELAY '00:00:01' 

或者,您可以处理故障路径并重试,可能是在延迟之后。

如果您使用SSIS连接管理器中的Excel连接。 RetainSameConnection酒店。 默认情况下是这样。 把它弄错,你就会全力以赴。

我偶然发现了这个链接并发布了这个链接以帮助其他人来到这里。

使用脚本任务时,请确保断开与Close()的连接或使用USING()内的连接。

在任务完成后保持连接,直到整个包完成,除非您执行上述任一操作。

如果消息引用了您的“.ispac”文件,那么您将获得一个未关闭的调试。 进入任务管理器并关闭调试主机。

对我来说,这个错误与SSIS无关,并且在最终任务没有响应BIDS之后发生

我的一个excel文件被BIDS调试器(DtsDebugHost.exe)锁定,关闭BIDS没有帮助。

最后使用http://filehippo.com/download_unlocker/向我展示了实际的储物柜,并简单地将其删除。

请注意,解锁DtsDebugHost.exe后需要重新启动BIDS

我将此函数与等待例程一起使用:

 public bool IsFileLocked(string filePath) { try { //Open the file exclusively using (File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.None)) { } } catch (IOException e) { var errorCode = Marshal.GetHRForException(e) & ((1 << 16) - 1); return errorCode == 32 || errorCode == 33; } return false; } 

如果您使用的是Excel连接,请在尝试移动/重命名文件之前,在脚本任务中使用以下代码(C#)关闭所有Excel进程。

 System.Diagnostics.Process[] proc=System.Diagnostics.Process.GetProcessesByName("Excel"); foreach (System.Diagnostics.Process p in proc) { if (!string.IsNullOrEmpty(p.ProcessName)) { try { p.Kill(); } catch { } } }