我有一个要求,我需要在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;
}
}
}