使用 C# 和 SQL Server 执行 SSIS 包






4.85/5 (13投票s)
这里是使用 C# 执行 SSIS 包的不同方法。
引言
有时我们需要通过 C# 应用程序调用/执行 SSIS 包。 这只是一个通过 C# 应用程序调用/执行 SSIS 包的小解决方案。
通过 C# 应用程序运行 SSIS 包有不同的方法。 我只是描述了通过 C# 应用程序执行 SSIS 包的两种简单方法。
使用代码
使用 C# 代码
为了通过 C# 调用 SSIS 包,我们必须为运行 DTS 包添加引用。 引用是:Microsoft.SqlServer.Dts.Runtime。
using Microsoft.SqlServer.Dts.Runtime;
上面的引用用于加载 SSIS 包,执行 SSIS 包以及与 SSIS 包相关的任务。
我采用了以下方法来执行 SSIS 包: -
- 通过使用 *app.LoadPackage(@"*\\C:\Documents and Settings\Sandeep\My Documents\SSISPackage\SsisPackage.dtsx", null); 加载 SSIS 包
- 将包详细信息存储到包变量中。
- 通过使用 package.Variables["User::EmpCode"].Value = '1'; 设置包变量。这里 package.Variables 用于访问已加载的 SSIS 包的变量。
- 将变量设置到 SSIS 包后,通过
package.Execute();
执行 SSIS 包,并将结果存储到DTSExecResult
变量中。 - 返回的结果将是 Failure 或 Success。
- 您可以根据 SSIS 包的执行结果显示任何结果。
描述上述部分的代码如下: -
public static void RunPackage()
{
Application app = new Application();
Package package = null;
//Load the SSIS Package which will be executed
package = app.LoadPackage(@"<a href="file://\\C:\Documents">\\" +
@"C:\Documents</a> and Settings\Sandeep\My Documents\SSISPackage\SsisPackage.dtsx", null);
//Pass the varibles into SSIS Package
package.Variables["User::EmpCode"].Value = '1';
package.Variables["User::EmpName"].Value = "SANDEEP";
//Execute the SSIS Package and store the Execution Result
Microsoft.SqlServer.Dts.Runtime.DTSExecResult results = package.Execute();
//Check the results for Failure and Success
if (results == Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure)
{
string err = "";
foreach (Microsoft.SqlServer.Dts.Runtime.DtsError local_DtsError in package.Errors)
{
string error = local_DtsError.Description.ToString();
err = err + error;
}
}
if (results == Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success)
{
string message = "Package Executed Successfully....";
}
//You can also return the error or Execution Result
//return Error;
}
使用 C# & 存储过程
我实现了另一种方法,即通过使用在 SQL Server 中创建的存储过程。 然后从 C# 代码执行该存储过程以执行 SSIS 包。
您可以随时使用该存储过程来执行 SSIS 包。
在存储过程中,我采用了 3 个参数,这 3 个参数用于执行 SSIS 包。
- EmpCode:将传递到包变量中的参数。
- PackagePath:将要执行的 SSIS 包。
- EmpName:将传递到包变量中的参数。
在该存储过程中,我正在创建一个使用 DTExec 实用程序的 SQL 查询。 然后通过 /SET \Package.Variables[EmpCode].Value;'+ @EmpCode 设置包变量
在存储过程中创建 SQL 语句后,该 SQL 语句将在命令 Shell 上运行。 这将由 EXEC master..xp_cmdshell @SQLQuery 语句使用。
执行该 SQL 查询后,如果发生任何错误,则调用 ErrorHandler。
存储过程脚本如下: -
CREATE PROCEDURE [dbo].[sp_ExecPackage]
(
@EmpCode Varchar(10),
@PackagePath Varchar(2000),
@EmpName varchar (10)
)
AS
DECLARE @SQLQuery AS VARCHAR(2000)
SET @SQLQuery = 'DTExec /FILE "'+@PackagePath+'" '
SET @SQLQuery = @SQLQuery + ' /SET \Package.Variables[EmpCode].Value;'+ @EmpCode
SET @SQLQuery = @SQLQuery + ' /SET \Package.Variables[EmpName].Value;'+ @EmpName
EXEC master..xp_cmdshell @SQLQuery
If @@ERROR <> 0 GoTo ErrorHandler
SET NoCount OFF
Return(0)
ErrorHandler:
Return(@@ERROR)
我已在 C# 代码中使用上面的存储过程来执行 SSIS 包。
在 RunLoad()
函数中,我使用了以下方法: -
- 传递包路径
- 传递存储过程名称
- 通过使用
SqlParameter paramEmpCode = new SqlParameter("@EmpCode", "2"); paramEmpCode.SqlDbType = System.Data.SqlDbType.VarChar;
传递存储过程的 SqlParameters - 调用
executeCommandQuery()
函数来执行存储过程。 - 执行存储过程后获取结果。
- 您可以将结果用于进一步的用途。
RunLoad()
和 executeCommandQuery()
的代码片段如下: -
public string RunLoad()
{
string result = string.Empty;
int rows = 0;
string PackagePath = "C:\Documents and Settings\Sandeep\My Documents\SSISPackage\SsisPackage.dtsx";
string SPCallSSIS = "[sp_ExecPackage]"; // Stored Procedure Name
//Passing Parameters to the Stored Procedure
SqlParameter paramEmpCode = new SqlParameter("@EmpCode", "2");
paramEmpCode.SqlDbType = System.Data.SqlDbType.VarChar;
SqlParameter paramEmpName = new SqlParameter("@EmpName", "SANDEEP");
paramEmpName.SqlDbType = System.Data.SqlDbType.VarChar;
SqlParameter paramPackagePath = new SqlParameter("@PackagePath", PackagePath);
paramPackagePath.SqlDbType = System.Data.SqlDbType.VarChar;
SqlParameter[] paramList = { paramEmpCode, paramEmpName, paramPackagePath };
rows = executeCommandQuery(SPCallSSIS, CommandType.StoredProcedure, paramList); // Executing Stored Procedure
if (rows > 0)
{
result = "Success";
}
else
{
result = "Error";
}
return result;
}
protected int executeCommandQuery(String sQuery, CommandType commandType, SqlParameter[] Param)
{
int rowEffected = 0;
protected SqlConnection _connection;
_connection.ConnectionString =
ConfigurationManager.ConnectionStrings["SQLConnStr"].ConnectionString; //From Web.config
//You can also write the connection string for SQL Server
try
{
_connection.Open();
SqlCommand command = new SqlCommand(sQuery, _connection);
command.CommandType = commandType;
command.Parameters.AddRange(Param);
command.CommandTimeout = 0;
rowEffected = command.ExecuteNonQuery();
_connection.Close();
}
catch (Exception ex)
{
rowEffected = -9;
_connection.Close();
throw ex;
}
finally
{
_connection.Close();
}
return rowEffected;
}
在 executeCommandQuery()
函数中,我们传递以下参数: -
-
sQuery
:将要执行的 SQL 查询。 这将是一个存储过程名称 -
commandType
:应该是 Text 或存储过程 -
Param
:Param 是传递到存储过程中的参数。
我已设置了 SQLConnection
字符串。 您将在此处直接编写连接字符串,或者从 C# 代码的 Web.Config 文件中设置连接字符串。
然后使用 ExecuteNonQuery()
来执行 SQL 语句或存储过程。
关注点
在编写以上代码时,我发现了通过 C# 执行 SSIS 包的不同方法。 这里只有两种方法。 在我的下一篇文章中,我将通过 SQL 作业和 Windows Profiler 执行该 SSIS 包。 这将由 C# 创建。