วิธีเรียกใช้แพ็คเกจ SSIS จาก. NET


87

ฉันมีแพ็คเกจ SSIS ที่ในที่สุดฉันก็อยากจะส่งผ่านพารามิเตอร์เช่นกันพารามิเตอร์เหล่านี้จะมาจากแอปพลิเคชัน. NET (VB หรือ C #) ดังนั้นฉันจึงอยากรู้ว่ามีใครรู้วิธีการทำเช่นนี้หรือดีกว่าเว็บไซต์ที่มีคำแนะนำที่เป็นประโยชน์ เกี่ยวกับวิธีการทำ

โดยพื้นฐานแล้วฉันต้องการเรียกใช้แพ็คเกจ SSIS จาก. NET ผ่านพารามิเตอร์แพ็คเกจ SSIS ที่สามารถใช้ภายในได้

ตัวอย่างเช่นแพ็คเกจ SSIS จะใช้การนำเข้าไฟล์แบบแบนไปยังฐานข้อมูล SQL อย่างไรก็ตามเส้นทางและชื่อของไฟล์อาจเป็นพารามิเตอร์ที่ส่งผ่านจากแอปพลิเคชัน. Net



10
สำหรับผู้อ่านในอนาคต: ก่อนใช้โซลูชันด้านล่างโปรดตรวจสอบใบอนุญาตของคุณ ฉันเชื่อว่าสิ่งนี้ใช้ได้กับเครื่องที่ติดตั้ง SSIS เท่านั้นไม่ใช่แค่การอ้างอิง DLL ในสภาพแวดล้อมการผลิตโดยทั่วไปแล้วแม้แต่การติดตั้ง SSIS โดยไม่ต้องติดตั้งเอ็นจิ้น DB เองก็ต้องมีใบอนุญาต
John Spiegel

ใครสามารถยืนยันความคิดเห็นของ @JohnSpiegel ได้บ้าง? สิ่งนี้จะใช้ได้เฉพาะในสภาพแวดล้อมการผลิตหากติดตั้ง SSIS
Josh Noe

FYI ลิงก์ไปยังการรันแพ็คเกจ SSIS โดยทางโปรแกรมถูกเปลี่ยนเป็นdocs.microsoft.com/en-us/archive/blogs/michen/…
LoJo

คำตอบ:


59

นี่คือวิธีตั้งค่าตัวแปรในแพ็คเกจจากรหัส -

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 ฉันคิดว่าคุณกำลังอ้างถึง Microsoft.SqlServer.Dts.Runtime? Dts เป็นเพียงชื่อเดิมของ SSIS - เป็นเพียงการประกาศเนมสเปซ รหัสด้านบนได้รับการสนับสนุนนับจากนี้
Spikeh

3
@IanCampbell ใช่ DTS คิดค่าเสื่อมราคาแล้ว (อันที่จริงฉันไม่คิดว่าคุณจะใช้ DTS กับ SQL Server เวอร์ชันล่าสุดได้ด้วยซ้ำไม่ใช่ว่าฉันพยายามหามัน!) อย่างไรก็ตามเนมสเปซ. Net ที่มีส่วนประกอบ SSIS บางส่วนยังคงมีคำ Dts ฉันรับรองว่าเป็นเวอร์ชันปัจจุบันและถูกต้อง
Spikeh

4
โอเคขอบคุณ @Spikeh! โปรดทราบว่าเมื่อไม่นานมานี้ฉันใช้โค้ดที่คล้ายกันเพื่อโหลดแพ็คเกจ SSIS ด้วย Dts ฉันต้องขอรับMicrosoft.SqlServer.ManagedDTS.dllไฟล์จาก "GAC" ในC:\Windows\assemblyโฟลเดอร์ด้วยตนเองเพื่อรวบรวมโค้ดดังกล่าว
Ian Campbell

3
ใช่ฉันก็ทำแบบเดียวกันเมื่อวานนี้! ฉันใช้ VS2012 และ. Net 4 (สำหรับแพ็คเกจ SSIS) / 4.5 (สำหรับการทดสอบหน่วยของฉัน) ฉันต้องรับแอสเซมบลีจาก C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91 เนื่องจากไม่มีอยู่ในโฟลเดอร์แอสเซมบลีอื่น ๆ หรือในโฟลเดอร์ โฟลเดอร์ SQL
Spikeh

1
การเชื่อมโยงบาง MSDN: 1) แพคเกจท้องถิ่น (เครื่องเดียวกัน): msdn.microsoft.com/en-us/library/ms136090.aspx 2) แพ็คเกจระยะไกล (เก็บไว้ในเครื่องอื่นที่ไม่ใช่ที่โปรแกรมกำลังทำงานอยู่) โดยใช้งานเอเจนต์ SQL: msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz

22

นี่คือวิธีดำเนินการกับแค็ตตาล็อก SSDB ที่เปิดตัวกับ 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;
}

รหัสนี้เป็นการปรับเปลี่ยนเล็กน้อย http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage

นอกจากนี้ยังมีบทความที่คล้ายกันที่http://domwritescode.com/2014/05/15/project-deployment-model-changes/


microsoft.sqlserver.management.integrationservices.dll อยู่ที่ไหน ฉันติดตั้ง SQL2014 แล้วและไม่พบการค้นหาใน Windows


ฉันสามารถใช้โค้ดด้านบนกับการปรับใช้แพ็คเกจได้หรือไม่ ฉันไม่พบวิธีการใด ๆ
Manish Jain

7

หากต้องการเพิ่มคำตอบของ @Craig Schwarze

นี่คือลิงค์ MSDN ที่เกี่ยวข้อง:

การโหลดและใช้งาน Local Package โดยทางโปรแกรม:

การโหลดและเรียกใช้แพ็คเกจระยะไกลโดยทางโปรแกรม

การจับภาพเหตุการณ์จากแพ็คเกจที่กำลังทำงานอยู่:

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

ดังนั้นมีอีกวิธีหนึ่งที่คุณสามารถเริ่มต้นจากภาษาใดก็ได้ วิธีที่ดีที่สุดฉันคิดว่าคุณสามารถสร้างไฟล์แบตช์ซึ่งจะเรียกแพ็คเกจ. dtsx ของคุณ

ถัดไปคุณเรียกไฟล์แบตช์จากภาษาใดก็ได้ เช่นเดียวกับในแพลตฟอร์ม windows คุณสามารถเรียกใช้ไฟล์แบตช์ได้จากทุกที่ฉันคิดว่านี่จะเป็นวิธีการทั่วไปที่สุดสำหรับวัตถุประสงค์ของคุณ ไม่มีการอ้างอิงรหัส

ด้านล่างเป็นบล็อกสำหรับรายละเอียดเพิ่มเติม ..

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

มีความสุขในการเขียนโค้ด .. :)

ขอบคุณ Ayan


0

คุณสามารถใช้ฟังก์ชันนี้ได้หากคุณมีตัวแปรใน 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");
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.