【问题标题】:execute ssis package in MVC在 MVC 中执行 ssis 包
【发布时间】:2019-07-07 10:31:39
【问题描述】:

下午,

是否可以使用 MVC 执行 SSIS 包?我正在创建的是一个 Web 应用程序,它会有一个按钮,一旦单击 SSIS 包就会运行。

SSIS 项目已设置并部署在 MSSQL 服务器上。

【问题讨论】:

  • 部署到 SSISDB 或 msdb?网页是否需要等待执行完成?页面是否需要传递参数来影响包的行为或启动它就足够了?
  • @theJ Upvote - 好问题。我很好奇,从误用案例来看,如果用户多次单击按钮或尝试在完成之前运行作业,预期的行为是什么?是否可以让作业按计划每 n 分钟运行一次?

标签: asp.net-core ssis .net-core asp.net-core-mvc


【解决方案1】:

SQL Server 2012+ 提供了一种出色的机制,用于通过集成服务目录 SSISDB 管理包及其执行。

以下代码提供了从位于 Demo 文件夹下的 MyProjectName SSIS 项目运行包 (Package2.dtsx) 的示例,其中 IntensityLevel 包参数设置为 11。

DECLARE @execution_id bigint;

EXEC SSISDB.catalog.create_execution
    @package_name = N'Package2.dtsx'
,   @execution_id = @execution_id OUTPUT
,   @folder_name = N'Demo'
,   @project_name = N'MyProjectName'
,   @use32bitruntime = False
,   @reference_id = NULL;

DECLARE @var0 int = 11;

EXEC SSISDB.catalog.set_execution_parameter_value
    @execution_id
,   @object_type = 30
,   @parameter_name = N'IntensityLevel'
,   @parameter_value = @var0;

DECLARE @var1 smallint = 1;

EXEC SSISDB.catalog.set_execution_parameter_value
    @execution_id
,   @object_type = 50
,   @parameter_name = N'LOGGING_LEVEL'
,   @parameter_value = @var1;

EXEC SSISDB.catalog.start_execution
    @execution_id;

获取如何构建上述 SQL 的示例的简单方法是打开 SQL Server Management Studio (SSMS) 并配置 SSIS 包的运行。导航到集成服务目录并找到要运行的包。右键单击并选择执行...

配置菜单打开并找到您要指定的参数。提供一个示例值,但不要单击“确定”。相反,单击该脚本按钮并将脚本指定到新窗口(或剪贴板)

现在您已经拥有了 SSMS 会发出的运行您的包的确切命令。获取该代码,使用您选择的参数化方法让您的 MVC 程序在参数的正确运行时值中存根,然后将所有 TSQL 包装在一个简单的数据库调用中(ole、ado、odbc 无关紧要)

【讨论】:

    【解决方案2】:

    您可以创建一个存储过程,您可以使用 SQLClient 左右从您的 MVC 应用程序调用它。 在这个存储过程中,您可以启动 SSIS 包。(有关如何执行此操作的更详细说明,请参见下面的链接)

    https://www.mssqltips.com/sqlservertip/2992/how-to-execute-an-integration-services-ssis-package-from-a-sql-server-stored-procedure/

    【讨论】:

    • 那只是一个控制台应用程序。并不是我想要实现的目标。
    • 为什么这不适用于MVC,背后只是.NET?它只是使用 System.Data.SqlClient 对存储过程的调用。您也可以使用 EF 调用存储过程。
    【解决方案3】:

    我创建了一个运行 SSIS 包的存储过程。在 MVC 中它调用存储过程 -

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Index()
    {
        //code that updates DB
    
        #region Run Stored Procedure
        //connect to the SQL server
        var connection = new SqlConnection(_configuration.GetConnectionString("DatabaseConnection"));
        //command that runs procedure on the SQL server
        var command = new SqlCommand("RebuildSelection", connection)
        {
            CommandType = CommandType.StoredProcedure,
            CommandText = "RebuildSelection"
        };
        //get text from stored procedure to show success/error messages
        SqlParameter text = new SqlParameter("@Text", SqlDbType.NVarChar, 1000)
        {
            //output as its displayed to the user
            Direction = ParameterDirection.Output
        };
        //add the params
        command.Parameters.Add(text);
        connection.Open();
        //run query
        command.ExecuteNonQuery();
        //used to return success/error messages to user
        ViewData["Message"] = text.Value;
        connection.Close();
        #endregion
    
        return View();
    }
    

    这个link 对创建过程有很大帮​​助。

    这个one 帮助将消息返回给用户。

    【讨论】:

      【解决方案4】:

      C# 可用于执行部署到 SSISDB 的包,如下所示。在SqlConnection 对象中创建的初始连接将是包部署到的服务器。在下面的示例中,30 的ObjectType 用于包参数。对于项目级别的参数,这可以更改为 20。

      using System.Data.SqlClient;
      using Microsoft.SqlServer.Management.IntegrationServices;
      using System.Collections.ObjectModel;
      
              string folder = "Folder of Package";
              string project = "Project Of Package";
              string packageName = "PackageName.dtsx";
              string packageParameter = "ParameterValue";
      
              // server where package is deployed
              SqlConnection connString = new SqlConnection(@"Data Source=ServerWherePackageDeployed;Initial Catalog=SSISDB;Integrated Security=SSPI;");
              IntegrationServices ssisConnString = new IntegrationServices(connString);
      
              //create PackageInfo object for package to execute
              Microsoft.SqlServer.Management.IntegrationServices.PackageInfo package = ssisConnString.Catalogs["SSISDB"].Folders[folder].Projects[project].Packages[packageName];
      
              Collection <Microsoft.SqlServer.Management.IntegrationServices.PackageInfo.ExecutionValueParameterSet> parameterList = new Collection<Microsoft.SqlServer.Management.IntegrationServices.PackageInfo.ExecutionValueParameterSet>();
      
              //set logging level to basic
              parameterList.Add(new Microsoft.SqlServer.Management.IntegrationServices.PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "LOGGING_LEVEL", ParameterValue = 1 });
      
              parameterList.Add(new Microsoft.SqlServer.Management.IntegrationServices.PackageInfo.ExecutionValueParameterSet { ObjectType = 30, ParameterName = "ParameterName", ParameterValue = packageParameter });
      
              package.Execute(false, null, parameterList);
      

      【讨论】:

      • 这是一个控制台应用,你不能将using Microsoft.SqlServer.Management.IntegrationServices;添加到MVC中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2010-10-25
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      相关资源
      最近更新 更多