【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.Connections.Addに渡す文字列はIntegration Services (SSIS) の接続の「組み込みの接続マネージャー」にある「Type」を渡せばOK。
- タスク作成時に指定できるSTOCKモニカーに関してはプログラムによるタスクの追加を参照。
まとめ
PackageクラスのMSDNからいける各説明が本当にMSDNなのかと疑うほど情報量が多く、サンプルコードもMSDNにしては多いので、ここまでは案外さくさくと作れました。
頑張れば設計書を読み込んでパッケージは全部自動生成も夢じゃないとは思いますが、夢は夢のままにしておいたほうがいいと思います。挑戦してないですが、データフローで死ぬと思います。
各プロパティ名は作成済みのdtsxをテキストエディタで開けばなんとなく読めるので、そのあたりを参考にしつつ、どのパッケージでも使う共通のオブジェクトはこいつで作ってもいいかもしれません。そこまでする必要があるのか?と言われれば、まぁないんですが…。