Làm thế nào để thực thi một gói SSIS từ .NET?


85

Tôi có một gói SSIS mà cuối cùng tôi cũng muốn chuyển các tham số, các tham số này sẽ đến từ một ứng dụng .NET (VB hoặc C #), vì vậy tôi rất tò mò nếu có ai biết cách thực hiện điều này, hoặc tốt hơn là một trang web với các gợi ý hữu ích về cách thực hiện.

Vì vậy, về cơ bản tôi muốn thực thi một gói SSIS từ .NET chuyển các tham số gói SSIS mà nó có thể sử dụng bên trong nó.

Ví dụ: gói SSIS sẽ sử dụng tệp phẳng nhập vào db SQL tuy nhiên Đường dẫn và tên của tệp có thể là tham số được truyền từ ứng dụng .Net.



10
Đối với độc giả trong tương lai: Trước khi sử dụng giải pháp bên dưới, hãy xem lại việc cấp phép của bạn. Tôi tin rằng điều này chỉ hoạt động trên các máy được cài đặt SSIS, không chỉ tham chiếu DLL. Trong môi trường sản xuất, thông thường, ngay cả việc cài đặt SSIS mà không cần cài đặt chính công cụ DB cũng cần phải có giấy phép.
John Spiegel

Có ai có thể xác nhận nhận xét của @ JohnSpiegel không? Điều này sẽ chỉ hoạt động trên môi trường sản xuất nếu SSIS được cài đặt?
Josh Noe

FYI, liên kết tới gói Chạy SSIS theo chương trình đã được thay đổi thành docs.microsoft.com/en-us/archive/blogs/michen/…
LoJo

Câu trả lời:


58

Đây là cách đặt các biến trong gói từ mã -

using Microsoft.SqlServer.Dts.Runtime;

private void Execute_Package()
    {           
        string pkgLocation = @"c:\test.dtsx";

        Package pkg;
        Application app;
        DTSExecResult pkgResults;
        Variables vars;

        app = new Application();
        pkg = app.LoadPackage(pkgLocation, null);

        vars = pkg.Variables;
        vars["A_Variable"].Value = "Some value";               

        pkgResults = pkg.Execute(null, vars, null, null, null);

        if (pkgResults == DTSExecResult.Success)
            Console.WriteLine("Package ran successfully");
        else
            Console.WriteLine("Package failed");
    }

2
@IanCampbell Tôi cho rằng bạn đang đề cập đến Microsoft.SqlServer.Dts.Runtime? Dts chỉ là tên kế thừa của SSIS - nó chỉ là khai báo không gian tên. Đoạn mã trên được hỗ trợ về sau.
Spikeh

3
@IanCampbell Có, DTS bị mất giá (trên thực tế, tôi không nghĩ rằng bạn thậm chí có thể sử dụng DTS với các phiên bản mới nhất của SQL Server - không phải tôi đã cố gắng tìm ra nó!). Tuy nhiên, không gian tên .Net chứa một số thành phần SSIS vẫn chứa từ Dts. Tôi đảm bảo với bạn đó là phiên bản hiện tại và hợp lệ.
Spikeh

4
Được rồi, cảm ơn @Spikeh! Lưu ý, khi gần đây tôi đã triển khai mã tương tự để tải gói SSIS bằng Dts, tôi phải lấy Microsoft.SqlServer.ManagedDTS.dlltệp theo cách thủ công từ "GAC", trong C:\Windows\assemblythư mục, để biên dịch mã như vậy.
Ian Campbell

3
Vâng, tôi cũng vậy - tôi cũng làm như vậy ngày hôm qua! Tôi đang sử dụng VS2012 và .Net 4 (cho gói SSIS) / 4.5 (cho các bài kiểm tra đơn vị của tôi). Tôi phải tải lắp ráp từ C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91 vì nó không tồn tại trong bất kỳ thư mục lắp ráp nào khác hoặc trong Thư mục SQL.
Spikeh

1
Một số liên kết đến MSDN: 1) Gói cục bộ (cùng một máy): msdn.microsoft.com/en-us/library/ms136090.aspx . 2) gói từ xa (được lưu trữ trên một máy khác so với cái nơi mà các chương trình đang chạy), sử dụng công ăn việc làm đại lý SQL: msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz

21

Đây là cách thực hiện với danh mục SSDB đã được giới thiệu với SQL Server 2012 ...

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlClient;

using Microsoft.SqlServer.Management.IntegrationServices;

public List<string> ExecutePackage(string folder, string project, string package)
{
    // Connection to the database server where the packages are located
    SqlConnection ssisConnection = new SqlConnection(@"Data Source=.\SQL2012;Initial Catalog=master;Integrated Security=SSPI;");

    // SSIS server object with connection
    IntegrationServices ssisServer = new IntegrationServices(ssisConnection);

    // The reference to the package which you want to execute
    PackageInfo ssisPackage = ssisServer.Catalogs["SSISDB"].Folders[folder].Projects[project].Packages[package];

    // Add a parameter collection for 'system' parameters (ObjectType = 50), package parameters (ObjectType = 30) and project parameters (ObjectType = 20)
    Collection<PackageInfo.ExecutionValueParameterSet> executionParameter = new Collection<PackageInfo.ExecutionValueParameterSet>();

    // Add execution parameter (value) to override the default asynchronized execution. If you leave this out the package is executed asynchronized
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "SYNCHRONIZED", ParameterValue = 1 });

    // Add execution parameter (value) to override the default logging level (0=None, 1=Basic, 2=Performance, 3=Verbose)
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 50, ParameterName = "LOGGING_LEVEL", ParameterValue = 3 });

    // Add a project parameter (value) to fill a project parameter
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 20, ParameterName = "MyProjectParameter", ParameterValue = "some value" });

    // Add a project package (value) to fill a package parameter
    executionParameter.Add(new PackageInfo.ExecutionValueParameterSet { ObjectType = 30, ParameterName = "MyPackageParameter", ParameterValue = "some value" });

    // Get the identifier of the execution to get the log
    long executionIdentifier = ssisPackage.Execute(false, null, executionParameter);

    // Loop through the log and do something with it like adding to a list
    var messages = new List<string>();
    foreach (OperationMessage message in ssisServer.Catalogs["SSISDB"].Executions[executionIdentifier].Messages)
    {
        messages.Add(message.MessageType + ": " + message.Message);
    }

    return messages;
}

Mã này là một bản điều chỉnh nhỏ của http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage

Cũng có một bài viết tương tự tại http://domwritescode.com/2014/05/15/project-deployment-model-changes/


Microsoft.sqlserver.management.integrationservices.dll nằm ở đâu? Tôi đã cài đặt SQL2014 và không thể tìm thấy nó khi thực hiện tìm kiếm trên windows.


Tôi có thể sử dụng mã trên khi triển khai gói không? Tôi không thể tìm thấy bất kỳ phương pháp nào.
Manish Jain

7

Để thêm vào câu trả lời @Craig Schwarze,

Dưới đây là một số liên kết MSDN liên quan:

Tải và chạy gói cục bộ theo chương trình:

Tải và chạy một gói từ xa có lập trình

Ghi lại sự kiện từ một gói đang chạy:

using System;
using Microsoft.SqlServer.Dts.Runtime;

namespace RunFromClientAppWithEventsCS
{
  class MyEventListener : DefaultEvents
  {
    public override bool OnError(DtsObject source, int errorCode, string subComponent, 
      string description, string helpFile, int helpContext, string idofInterfaceWithError)
    {
      // Add application-specific diagnostics here.
      Console.WriteLine("Error in {0}/{1} : {2}", source, subComponent, description);
      return false;
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      string pkgLocation;
      Package pkg;
      Application app;
      DTSExecResult pkgResults;

      MyEventListener eventListener = new MyEventListener();

      pkgLocation =
        @"C:\Program Files\Microsoft SQL Server\100\Samples\Integration Services" +
        @"\Package Samples\CalculatedColumns Sample\CalculatedColumns\CalculatedColumns.dtsx";
      app = new Application();
      pkg = app.LoadPackage(pkgLocation, eventListener);
      pkgResults = pkg.Execute(null, null, eventListener, null, null);

      Console.WriteLine(pkgResults.ToString());
      Console.ReadKey();
    }
  }
}

1

Vì vậy, có một cách khác để bạn thực sự có thể kích hoạt nó từ bất kỳ ngôn ngữ nào. Theo tôi, cách tốt nhất là bạn có thể tạo một tệp batch sẽ gọi gói .dtsx của bạn.

Tiếp theo, bạn gọi tệp hàng loạt từ bất kỳ ngôn ngữ nào. Như trong nền tảng windows, bạn có thể chạy tệp hàng loạt từ bất cứ đâu, tôi nghĩ đây sẽ là cách tiếp cận chung nhất cho mục đích của bạn. Không có phụ thuộc mã.

Dưới đây là một blog để biết thêm chi tiết ..

https://www.mssqltips.com/sqlservertutorial/218/command-line-tool-to-execute-ssis-packages/

Chúc bạn viết mã vui vẻ .. :)

Cảm ơn, Ayan


0

Bạn có thể sử dụng Hàm này nếu bạn có một số biến trong SSIS.

    Package pkg;

    Microsoft.SqlServer.Dts.Runtime.Application app;
    DTSExecResult pkgResults;
    Variables vars;

    app = new Microsoft.SqlServer.Dts.Runtime.Application();
    pkg = app.LoadPackage(" Location of your SSIS package", null);

    vars = pkg.Variables;

    // your variables
    vars["somevariable1"].Value = "yourvariable1";
    vars["somevariable2"].Value = "yourvariable2";

    pkgResults = pkg.Execute(null, vars, null, null, null);

    if (pkgResults == DTSExecResult.Success)
    {
        Console.WriteLine("Package ran successfully");
    }
    else
    {

        Console.WriteLine("Package failed");
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.