SSIS - 将OLEDB连接的Excel文件移动到存档

时间:2015-07-14 10:24:18

标签: c# sql-server excel ssis

我已使用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

    }
}

1 个答案:

答案 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"

然后创建一个文件系统任务,将该副本移动到您的存档中。 这应该是诀窍(也许不是最好的方法,但应该工作)