Как выполнить пакет служб SSIS из .NET?

73

У меня есть пакет SSIS, который в конце концов мне тоже хотелось бы передать параметры, эти параметры будут получены из .NET-приложения (VB или С#), поэтому мне было любопытно, знает ли кто-нибудь, как это сделать, или, еще лучше, веб-сайт с полезными подсказками о том, как это сделать. Поэтому в основном я хочу выполнить пакет SSIS из .NET, передавая параметры пакета SSIS, которые он может использовать в нем. Например, пакет SSIS будет использовать плоский импорт файлов в SQL db, однако путь и имя файла могут быть параметром, который передается из приложения .Net.

  • 0
    Запуск пакета служб SSIS программно
  • 10
    Для будущих читателей: прежде чем использовать решение ниже, проверьте свое лицензирование. Я полагаю, что это работает только на машинах с установленным SSIS, а не только на DLL. В производственной среде обычно даже для установки служб SSIS без установки самого механизма БД требуется лицензия.
Показать ещё 1 комментарий
Теги:
sql-server
ssis

3 ответа

54

Вот как установить переменные в пакете из кода -

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");
    }
  • 0
    Спасибо @Craig! Тем не менее, Dts теперь устарела с SQL Server 2008, как вы можете сделать это без пакета Dts ?
  • 2
    @IanCampbell Я полагаю, вы имеете в виду Microsoft.SqlServer.Dts.Runtime? Dts - это просто устаревшее имя для SSIS - это просто объявление пространства имен. Код выше поддерживается в будущем.
Показать ещё 6 комментариев
14

Вот как это делается с каталогом 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/

  • 0
    Где находится файл microsoft.sqlserver.management.integrationservices.dll? Я установил SQL2014 и не могу найти его, выполняя поиск Windows.
  • 2
    Видимо, это только в GAC: расположение сборки Microsoft.SqlServer.Management.IntegrationServices.dll
Показать ещё 2 комментария
7

Чтобы добавить к ответу @Craig Schwarze,

Вот некоторые связанные ссылки MSDN:

Загрузка и запуск локального пакета программно:

Загрузка и запуск удаленного пакета программно

Захват событий из запущенного пакета:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню