65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 和 SQL Server 执行 SSIS 包

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (13投票s)

2013年9月26日

CPOL

3分钟阅读

viewsIcon

144325

这里是使用 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 包: -

  1. 通过使用 *app.LoadPackage(@"*\\C:\Documents and Settings\Sandeep\My Documents\SSISPackage\SsisPackage.dtsx", null); 加载 SSIS 包
  2. 将包详细信息存储到包变量中。
  3. 通过使用 package.Variables["User::EmpCode"].Value = '1'; 设置包变量。这里 package.Variables 用于访问已加载的 SSIS 包的变量。
  4. 将变量设置到 SSIS 包后,通过 package.Execute(); 执行 SSIS 包,并将结果存储到 DTSExecResult 变量中。
  5. 返回的结果将是 Failure 或 Success。
  6. 您可以根据 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() 函数中,我使用了以下方法: -

  1. 传递包路径
  2. 传递存储过程名称
  3. 通过使用 SqlParameter paramEmpCode = new SqlParameter("@EmpCode", "2"); paramEmpCode.SqlDbType = System.Data.SqlDbType.VarChar; 传递存储过程的 SqlParameters
  4. 调用 executeCommandQuery() 函数来执行存储过程。
  5. 执行存储过程后获取结果。
  6. 您可以将结果用于进一步的用途。

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# 创建。

© . All rights reserved.