我有一个Integration Services包(VS 2012),它从Excel工作簿加载值并将它们存储在SQL Server中。我使用第三方库在C#脚本任务中提取工作簿数据,但在此之前,我在任务中创建了一个文件流:
MessageBox.Show("Step 1");
using (FileStream fsWorkbook = new FileStream(strWkbkFilePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
MessageBox.Show("Step 2");
//...
}
FileStream构造因错误而崩溃"进程无法访问该文件...因为它正被另一个进程使用。"我知道这是发生崩溃的地方,因为我看到了"步骤1"消息框,但不是"步骤2"。
令人沮丧的是,如果我在脚本任务中设置断点,在导致错误的行之前,并开始逐步执行代码,我就可以继续并访问工作簿文件了没有错误。起初我认为这可能是由于竞争条件,但后来我添加了上面显示的消息框,它也会在创建文件流之前暂停执行。由于MessageBox的暂停,在非调试模式下运行时不会阻止错误。
我已尝试使用 System.IO.File.Open 和FileStream构造函数,两者都使用 FileShare.ReadWrite ,按照this S.O. thread,那为什么我会收到共享错误?为什么调试时不会发生?
答案 0 :(得分:0)
好的,原来这是由于工作簿中的OleDbConnection在包中的先前脚本任务中保持打开状态。
我觉得奇怪的是SSIS脚本调试器设法在后续包中尝试打开FileStream之前解决此问题。
请注意,如果在SSIS中调试文件权限问题时遇到奇怪现象。