読者です 読者をやめる 読者になる 読者になる

【C#】Microsoft.SqlServer.Dts.Runtimeを使ってDTSXを生成する

コードサンプル

下準備としてMicrosoft.SqlServer.ManagedDTSを参照設定に追加しないといけないんですが、.NETタブからは見つけられなかったので、C:\Windows\assembly\GAC_MSIL\配下を探してみてください。

using Microsoft.SqlServer.Dts.Runtime;

namespace CreatePackage
{
    class Program
    {
        static void Main(string[] args)
        {
            //Package.Nameがパッケージ名になる
            using (var package = new Package { Name = "Test" })
            {
                //変数の追加
                using (var var = package.Variables.Add("変数テスト", false, "User", "テスト"))
                {
                    //式の設定
                    var.Expression = "(DT_WSTR,50)GETDATE()";
                    //EvaluateAsExpressionをtrueにすることでSSDTで表示した際に評価済みにできる
                    var.EvaluateAsExpression = true;
                }

                var dbId = string.Empty;

                //接続マネージャーの追加
                //Package.Connections.Addに渡す文字列は補足参照
                using (var manager = package.Connections.Add("OLEDB"))
                {
                    manager.Name = "TestDB";
                    manager.ConnectionString = "Provider=SQLOLEDB.1;Data Source=(local);Initial Catalog=master;Integrated Security=SSPI;";
                    dbId = manager.ID;

                    //SetExpressionを使用することでConnectionStringのExpressionを事前に設定できる
                    //勿論、事前に変数を追加しておけばそれを使用することもできる
                    //manager.SetExpression("ConnectionString", "@[User::hoge]");
                }

                //タスクを作成
                //Package.Executables.Addに渡す文字列は補足参照
                //TaskHostにキャストすることでタスクに共通のプロパティを設定することができる
                using (var th = package.Executables.Add("STOCK:SQLTask") as TaskHost)
                {
                    th.Name = "SQL Test";
                    //TaskHost.Properties["foo"].SetValueで各タスク固有のプロパティにアクセスできる
                    th.Properties["Connection"].SetValue(th, dbId);
                    th.Properties["SqlStatementSource"].SetValue(th, "SELECT * FROM HOGE");
                }
                

                //DTSXとして出力
                new Application().SaveToXml(string.Format(@"C:\temp\{0}.dtsx", package.Name), package, null);

                //Package.Execute()で保存せずに実行もできる
                //package.Execute();
            }
            
        }
    }
}

補足

まとめ

PackageクラスのMSDNからいける各説明が本当にMSDNなのかと疑うほど情報量が多く、サンプルコードもMSDNにしては多いので、ここまでは案外さくさくと作れました。

頑張れば設計書を読み込んでパッケージは全部自動生成も夢じゃないとは思いますが、夢は夢のままにしておいたほうがいいと思います。挑戦してないですが、データフローで死ぬと思います。

各プロパティ名は作成済みのdtsxをテキストエディタで開けばなんとなく読めるので、そのあたりを参考にしつつ、どのパッケージでも使う共通のオブジェクトはこいつで作ってもいいかもしれません。そこまでする必要があるのか?と言われれば、まぁないんですが…。