使用ASP.Net执行SSIS包(DTSX)






4.67/5 (23投票s)
本文演示了创建SSIS包并使用ASP.Net执行该包的步骤。
引言
我接到一个任务,要开发一个执行SQL Server 2005 SSIS包的网页。由于我对SSIS了解不多,一开始很难找到解决方案。但通过在线帮助,我最终解决了这个问题。我创建了一个简单的DTSX包,它将电子表格数据导入数据库表,然后我执行包内的存储过程来对数据库表进行操作。所有这些过程都通过asp.net执行。下面我将演示实现这一目标的步骤。
创建SSIS包
先决条件
1)数据库表
CREATE TABLE [dbo].[tblBusiness](
[Business_ID] [numeric](18, 0) NULL,
[Business_Name] [nvarchar](50) NULL
) ON [PRIMARY]
2)Excel数据:BusinessTemplate.xls
SSIS包工作流设计
步骤 1:将Excel数据加载到数据库表tblBusiness。
1.在“项目”菜单下单击“SSIS导入导出向导”。
2.单击“下一步”按钮。
3.选择源并单击下一步。
在我们的例子中,源是Excel。当通过.net代码分配时,指定的路径将被覆盖。
例如:package.Connections["SourceConnectionExcel"].ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;data source=" + tbFileName.Text + ";Extended Properties=Excel 8.0; ";
3.选择目标并单击下一步。
4.选择“从一个或多个表复制数据”并单击下一步。
5.出现“完成向导”屏幕,单击“完成”。
完成上述步骤后,可以看到以下视图:
在“控制流”选项卡下
在“数据流”选项卡下
注意:在“连接管理器”中会出现两个连接对象:
仅测试数据流是否正确构建。如果变成绿色,则数据流已成功执行。如果变成红色,则连接字符串有问题。
步骤 2:创建SQL任务脚本以删除数据库表。
1.创建全局包级别的变量。这些变量是包的输入参数。因此,拥有SQL存储过程的包可以消耗这些输入参数。
2)在“控制流”选项卡下双击“准备SQL任务”。
我们使用了“EXEC DeleteBusinessEntry ?” 这个过程将接收输入参数 @Business_ID。
创建存储过程
CREATE PROCEDURE DeleteBusinessEntry
@Business_ID bigint
AS
BEGIN
Delete from tblBusiness where Business_ID=@Business_ID
END
3)单击“参数映射”,以便将全局用户定义的输入变量映射到存储过程的输入变量。它是区分大小写的。还要注意数据类型及其大小。每个变量在其中都应有不同的ParameterName。
步骤 2:创建SQL任务脚本以更新已加载Excel数据的数据库表内容。
从工具箱将“执行SQL任务”拖放到控制流屏幕上。将“准备SQL任务”连接到数据流任务。也将数据流任务连接到SQL脚本任务对象。
2)在“控制流”选项卡下双击“执行SQL任务”。
我们使用了“EXEC UpdateBusinessEntry ?,?” 这个过程将接收两个输入参数 @Business_ID / @Business_Name。
创建存储过程
CREATE PROCEDURE UpdateBusinessEntry
@Business_ID bigint ,
@Business_Name varchar(100)
AS
BEGIN
Update tblBusiness
Set Business_Name=@Business_Name
where Business_ID=@Business_ID
END
3)单击“参数映射”,以便将全局用户定义的输入变量映射到存储过程的输入变量。它是区分大小写的。还要注意数据类型及其大小。每个变量在其中都应有不同的ParameterName。
完成以上三个步骤后,运行包。
使用ASP.Net执行SSIS包
重要引用:Microsoft.SqlServer.ManagedDTS
下面的代码片段是自解释的。
using Microsoft.SqlServer.Dts.Runtime;
protected void btnExecute_Click(object sender, EventArgs e)
{
Application app = new Application();
Package package = null;
try
{
string fileName =
Server.MapPath(System.IO.Path.GetFileName(FileUpload1.PostedFile.FileName.ToString()));
FileUpload1.PostedFile.SaveAs(fileName);
//Load DTSX
package =
app.LoadPackage(@"D:\SSIS_ASP_NET\SSIS_ASP_NET_DEMO\SSIS_ASP_NET_DEMO\Package1.dtsx", null);
//Global Package Variable
Variables vars = package.Variables;
vars["Business_ID"].Value = txtBusinessID.Text;
vars["Business_Name"].Value = txtBusinessName.Text;
//Specify Excel Connection From DTSX Connection Manager
package.Connections["SourceConnectionExcel"].ConnectionString =
"provider=Microsoft.Jet.OLEDB.4.0;data source=" + fileName + ";Extended Properties=Excel 8.0; ";
//Execute DTSX.
Microsoft.SqlServer.Dts.Runtime.DTSExecResult results = package.Execute();
}
catch (Exception ex)
{
throw ex;
}
finally
{
package.Dispose();
package = null;
}
}
以上代码中重要的因素是将Excel文件的源分配给SSIS包,例如package.Connections["SourceConnectionExcel"].ConnectionString
HTML设计
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Execute SSIS</title> </head> <body> <form id="form1" runat="server"> <div> <div style="text-align: left"> <table> <tr> <td style="height: 26px" colspan="2"> <h2>Execute SSIS Package</h2> </td> </tr> <tr> <td style="width: 100px; height: 26px"> <strong> Business ID</strong></td> <td style="width: 100px; height: 26px"> <asp:TextBox ID="txtBusinessID" runat="server"></asp:TextBox></td> </tr> <tr> <td style="width: 100px"> <strong>BusinessName</strong></td> <td style="width: 100px"> <asp:TextBox ID="txtBusinessName" runat="server"></asp:TextBox></td> </tr> <tr> <td style="width: 100px"> <strong>Upload Excel</strong></td> <td style="width: 100px"> <asp:FileUpload ID="FileUpload1" runat="server" /></td> </tr> <tr> <td style="width: 100px"> </td> <td style="width: 100px"> <asp:Button ID="btnExecute" runat="server" Text="Execute SSIS" OnClick="btnExecute_Click" /></td> </tr> </table> </div> <br /> <br /> <br /> <br /> </div> </form> </body> </html>
参考
在将此实现到开发中之前,请参阅本文。本文描述了生产部署的先决条件。https://codeproject.org.cn/KB/aspnet/Deployment_SSIS_NET.aspx
结论
希望本文能达到目的。欢迎提出任何建议或更正。