我已使用Microsoft Office 12.0 Access Database Engine OLE DB Provider
作为Excel架构创建了一个连接,以循环浏览Excel文件中的所有工作表,如此问题所示How to loop through Excel files and load them into a database using SSIS package?
使用Foreach ADO.NET Schema Rowset Enumerator
循环遍历excel文件。
现在一切正常,但从Excel导入数据后,我想将该文件移动到Archive文件夹。并尝试使用File System Task
,但我收到错误
[文件系统任务]错误:出现以下错误消息时出错:"进程无法访问该文件,因为该文件正由另一个进程使用。"。
我还尝试使用此link中的脚本任务。但是我收到了一些错误,无法解决错误,因为我对C#一无所知。
以下是我尝试使用脚本任务移动文件时遇到的错误。
at System.RuntimeMethodHandle.InvokeMethod(Object target,Object [] arguments,Signature sig,Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj,Object [] parameters,Object [] arguments) 在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化) at System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParams) 在Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()。
更新:
这是我完整的代码,我试图移动这些文件。
如果我在enum ScriptResults
添加断点,我就不会获得该弹出窗口并且任务已成功完成,并且该文件也已移至归档,但如果我不添加任何在C#代码中断点,我得到弹出文件,文件没有移动到存档。
#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;
#endregion
namespace ST_9fc6ad7db45c4a7bb49f303680f789ef
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
DirectoryInfo di = new DirectoryInfo(Dts.Variables["SplitSkill_FolderPath"].Value.ToString());
FileInfo[] fi = di.GetFiles("*.xlsx");
String filename = fi[0].Name;
string sourceFileName = filename;
string destinationFile = @"D:\Flipkart\Data\Split Skill\Archive\" + sourceFileName;
string sourceFile = @"D:\Flipkart\Data\Split Skill\" + sourceFileName;
if (File.Exists(destinationFile))
File.Delete(destinationFile);
// To move a file or folder to a new location:
System.IO.File.Move(sourceFile, destinationFile);
Dts.TaskResult = (int)ScriptResults.Success;
}
#region ScriptResults declaration
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
#endregion
}
}
答案 0 :(得分:0)
据我了解,我认为你有一个循环工作表和另一个循环文件的任务。所以你可能在foreach循环中有2个任务。尝试使用系统任务在foreach循环中复制文件
表示可执行文件
c:\windows\system32\cmd.exe
以及像
这样的论点C COPY "C:\xxx\abc\\Destination_template.accdb" "C:\xxx\abc\\Destination_template.accdb"Destination_template - Kopie.accdb"
然后创建一个文件系统任务,将该副本移动到您的存档中。 这应该是诀窍(也许不是最好的方法,但应该工作)