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

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

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

  • 在我的数据库中创建了一个包含50列的样本表(因为这是我在源excel中随时可以拥有的最大列数) .

  • 在包执行之前,我获取该样本表的副本,给它一个名称,因为我需要为每个源提供不同的表 .

  • 通过c#代码和SSIS变量动态传递Excel源文件 .

由于我的初始映射是在包中的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;


        }

    }

}