.NET'ten bir SSIS paketi nasıl çalıştırılır?


87

Sonunda parametreleri de iletmek istediğim bir SSIS paketim var, bu parametreler bir .NET uygulamasından (VB veya C #) gelecektir, bu yüzden birinin bunu nasıl yapacağını bilen var mı yoksa daha iyisi yararlı ipuçları içeren bir web sitesi var mı diye merak ettim. nasıl yapılacağı hakkında.

Bu yüzden temelde .NET'ten bir SSIS paketi yürütmek ve içinde kullanabileceği SSIS paketi parametrelerini iletmek istiyorum.

Örneğin, SSIS paketi bir SQL veritabanına düz dosya içe aktarmayı kullanacaktır, ancak dosyanın Yolu ve adı .Net uygulamasından iletilen parametre olabilir.



10
Gelecekteki okuyucular için: Aşağıdaki çözümü kullanmadan önce lisansınızı gözden geçirin. Bunun yalnızca DLL referansı değil, yalnızca SSIS yüklü makinelerde çalıştığına inanıyorum. Bir üretim ortamında, tipik olarak, DB motorunu kurmadan SSIS kurmak bile bir lisans gerektirir.
John Spiegel

@ JohnSpiegel'in yorumunu doğrulayan var mı? Bu, yalnızca SSIS kuruluysa bir üretim ortamında mı çalışır?
Josh Noe

Bilginize, SSIS paketini programlı olarak çalıştırma bağlantısı docs.microsoft.com/en-us/archive/blogs/michen/…
LoJo

Yanıtlar:


59

İşte paketteki değişkenleri koddan nasıl ayarlayacağınız -

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'a atıfta bulunduğunuzu varsayıyorum? Dts, SSIS için yalnızca eski addır - yalnızca ad alanı bildirimi. Yukarıdaki kod ileride desteklenmektedir.
Spikeh

3
@IanCampbell Evet, DTS değer kaybetti (aslında, DTS'yi SQL Server'ın en son sürümleriyle bile kullanabileceğinizi sanmıyorum - bulmaya çalıştığımdan değil!) Ancak, bazı SSIS bileşenlerini içeren .Net ad alanı hala Dts sözcüğünü içerir. Sizi temin ederim bu güncel sürüm ve geçerli.
Spikeh

4
Tamam, teşekkürler @Spikeh! Dts ile bir SSIS paketini yüklemek için yakın zamanda benzer bir kod uyguladığımda , bu kodu derlemek Microsoft.SqlServer.ManagedDTS.dlliçin C:\Windows\assemblydosyayı klasördeki "GAC" dan manuel olarak almak zorunda kaldım .
Ian Campbell

3
Evet, ben de - dün aynısını yapıyordum! VS2012 ve .Net 4 (SSIS paketi için) / 4.5 (birim testlerim için) kullanıyorum. Derlemeyi C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91'den almak zorunda kaldım çünkü diğer derleme klasörlerinin hiçbirinde veya SQL klasörleri.
Spikeh

1
MSDN'e bazı bağlantılar: 1) Yerel paket (aynı makine): msdn.microsoft.com/en-us/library/ms136090.aspx . 2) SQL aracı işlerini kullanarak uzak paket (programın çalıştığı makineden farklı bir makinede saklanır): msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz

22

İşte SQL Server 2012 ile tanıtılan SSDB kataloğu ile bunun nasıl yapılacağı ...

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;
}

Kod, http://social.technet.microsoft.com/wiki/contents/articles/21978.execute-ssis-2012-package-with-parameters-via-net.aspx?CommentPosted=true#commentmessage'ın küçük bir uyarlamasıdır.

Http://domwritescode.com/2014/05/15/project-deployment-model-changes/ adresinde de benzer bir makale bulunmaktadır.


Microsoft.sqlserver.management.integrationservices.dll nerede bulunur? SQL2014'ü yükledim ve Windows araması yaparken bulamıyorum.


Yukarıdaki kodu paket dağıtımıyla kullanabilir miyim? Herhangi bir yöntem bulamadım.
Manish Jain

7

@Craig Schwarze cevabına eklemek için,

İşte bazı ilgili MSDN bağlantıları:

Bir Yerel Paketi Programlı Olarak Yükleme ve Çalıştırma:

Bir Uzak Paketi Programlı Olarak Yükleme ve Çalıştırma

Çalışan Bir Paketten Olayları Yakalama:

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

Yani onu herhangi bir dilden ateşlemenin başka bir yolu var. Bence en iyi yol, .dtsx paketinizi çağıracak bir toplu iş dosyası oluşturabilirsiniz.

Daha sonra toplu iş dosyasını herhangi bir dilden çağırırsınız. Windows platformunda olduğu gibi, toplu iş dosyasını her yerden çalıştırabilirsiniz, bunun amacınız için en genel yaklaşım olacağını düşünüyorum. Kod bağımlılığı yok.

Daha fazla ayrıntı için aşağıda bir blog var ..

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

Mutlu kodlamalar .. :)

Teşekkürler ayan


0

SSIS'de bazı değişkenleriniz varsa bu Fonksiyonu kullanabilirsiniz.

    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");
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.