Excel源和目标SQL Server表中的SSIS动态列映射

时间:2014-02-10 08:21:15

标签: c# sql sql-server excel ssis

我有一个要求,我需要在SQL Server表中转储我的Excel数据。 excel文件可能会有所不同(每次都有不同的列数),对于每个excel源文件,每次都必须在SQL Server中创建一个新表。

我尝试使用SSIS任务来处理输入/输出列之间的映射必须在包中预定义。此外,在执行“OLE DB目标”任务之前,必须存在我正在转储数据的目标表。

为了克服一些限制,我做了一些解决方法:

  1. 在我的数据库中创建了一个包含50列的示例表(因为这是我在源excel中随时可以拥有的最大列数。)
  2. 在包执行之前,我会获取该样本表的副本,为其命名,因为我需要为每个源提供不同的表。
  3. 通过c#代码和SSIS变量动态传递Excel源文件。
  4. 由于我的初始映射是在包中的50个输入/输出列之间,所以当下一个excel到达包含较少no的包时。列,包执行失败。 我正在通过c#代码运行包,当我在BIDS中独立运行此包时,它自己传递SSIS变量值,它失败并且列引用无效错误。 我必须通过代码运行这个包,并且每次都不能在失败时重新映射它。

    我无法在此论坛上粘贴我的声誉的Package快照。它是一个包含2个任务的简单包,即“Excel Source”和'OLE DB Destination'。我面临的唯一问题是包中的动态映射。休息一切正常。

    请帮我解决这个问题。在此先感谢!!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    
    using Microsoft.SqlServer.Dts.Runtime;
    
    namespace SSRSReports
    {
        public partial class About : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                btnpkg.Visible = true;
            }
    
            protected void btnpkg_Click(object sender, EventArgs e)
            {
                string newtableName = "DATA_MD0000001_I606423";
    
                string sourceExcel = FileUpload1.PostedFile.FileName;
    
                DataQuery(newtableName);
    
                RunPackage(sourceExcel, newtableName);
            }
    
            public void DataQuery(string newtableName)
            {
                DataClasses1DataContext dc = new DataClasses1DataContext();
    
                dc.ExecuteCommand("select * into" + " " + newtableName + " " + "from DummyTable");
            }
    
            public void RunPackage(string SourceExcelPath, string DestinationTableName)
            {
                string pkgLocation;
                Package pkg;
                Application app;
                DTSExecResult pkgResults;
                Variables vars;
    
                lblResults.Visible = false;
    
                pkgLocation =
                    @"C:\Visual Studio 2008\Projects\DemoProject\DemoProject\Package.dtsx";
                app = new Application();
                pkg = app.LoadPackage(pkgLocation, null);
    
                vars = pkg.Variables;
            vars["SourceExcelFile"].Value = SourceExcelPath;
                vars["DestinationTableName"].Value = DestinationTableName;
    
                pkgResults = pkg.Execute(null, vars, null, null, null);
    
                if (pkgResults == DTSExecResult.Success)
                    lblResults.Text = "Package ran successfully";
                else
                    lblResults.Text = "Package failed";
    
                lblResults.Visible = true;
    
    
            }
    
        }
    
    }
    

0 个答案:

没有答案