.NETからSSISパッケージを実行する方法は?


87

私は最終的にパラメータも渡したいSSISパッケージを持っています。これらのパラメータは.NETアプリケーション(VBまたはC#)から取得されるので、誰かがこれを行う方法を知っているか、もっと良いのは役立つヒントのあるWebサイトです。それを行う方法について。

したがって、基本的には、.NETからSSISパッケージを実行して、その中で使用できるSSISパッケージパラメータを渡します。

たとえば、SSISパッケージはSQLデータベースへのフラットファイルのインポートを使用しますが、ファイルのパスと名前は、.Netアプリケーションから渡されるパラメーターである可能性があります。



10
将来の読者へ:以下のソリューションを使用する前に、ライセンスを確認してください。これは、DLL参照だけでなく、SSISがインストールされているマシンでのみ機能すると思います。実稼働環境では、通常、DBエンジン自体をインストールせずにSSISをインストールする場合でも、ライセンスが必要です。
John Spiegel

誰かが@JohnSpiegelのコメントを確認できますか?これは、SSISがインストールされている場合にのみ、実稼働環境で機能しますか?
Josh Noe 2017年

回答:


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 2013

3
@IanCampbellはい、DTSは減価償却されています(実際、最新バージョンのSQL ServerでDTSを使用することさえできないと思います-私が見つけようとしたわけではありません!)。ただし、一部のSSISコンポーネントを含む.Net名前空間には、引き続きDtsワードが含まれています。それが現在のバージョンであり、有効であることを保証します。
Spikeh 2013

4
OK、@ Spikehに感謝します!最近、Dtsを使用してSSISパッケージをロードするために同様のコードを実装したときMicrosoft.SqlServer.ManagedDTS.dll、そのC:\Windows\assemblyようなコードをコンパイルするには、フォルダー内の「GAC」からファイルを手動で取得する必要がありました。
イアンキャンベル

3
はい、私もそうしました-私は昨日同じことをしていました!VS2012と.Net4(SSISパッケージ用)/ 4.5(単体テスト用)を使用しています。アセンブリは他のどのアセンブリフォルダーにも存在しなかったため、C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.SqlServer.ManagedDTS \ v4.0_11.0.0.0__89845dcd8080cc91から取得する必要がありました。 SQLフォルダー。
Spikeh 2013

1
MSDNへのいくつかのリンク:1)ローカルパッケージ(同じマシン):msdn.microsoft.com/en-us/library/ms136090.aspx。2)SQLエージェントジョブを使用したリモートパッケージ(プログラムが実行されているマシン以外のマシンに格納されている):msdn.microsoft.com/en-us/library/ms403355.aspx
Faiz

22

SQL Server2012で導入されたSSDBカタログを使用してそれを行う方法は次のとおりです...

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サーチを実行しても見つかりません。

2
どうやらそれはGACにのみあります

上記のコードをパッケージ展開で使用できますか?方法が見つかりませんでした。
マニッシュジャイン

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

1

したがって、実際に任意の言語から起動できる別の方法があります。私が思う最善の方法は、.dtsxパッケージを呼び出すバッチファイルを作成することだけです。

次に、任意の言語からバッチファイルを呼び出します。Windowsプラットフォームと同様に、どこからでもバッチファイルを実行できます。これは、目的にとって最も一般的なアプローチになると思います。コードの依存関係はありません。

詳細については、以下のブログをご覧ください。

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

ハッピーコーディング.. :)

ありがとう、アヤン


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.