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

give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

C#からDTSの情報を取得するサンプルコード

事前にCOMの「Microsoft DTSPackage Object Library」みたいなのを参照設定しておきます。
たぶんEnterprise Managerかなんかがローカルにインストールされてある必要があるんじゃないかと思います。


で、こんな感じのコードで情報が取得できます。

using System;
using System.Collections.Generic;
using System.Text;
using DTS;

class DtsAgent
{
    //DTSのPackage情報を自作のDTOオブジェクトに詰めて返却するメソッド
    //注) DtsTaskが自作のDTOクラス。
    internal IList<DtsTask> GetTasks()
    {
        Application oDTSApp = new Application();
        //このプログラムではSettingsファイルにDBの接続情報を保存している
        PackageSQLServer oPkgSQLServer = oDTSApp.GetPackageSQLServer(
            Settings.Default.DBServer, Settings.Default.DBUser, Settings.Default.DBPassword, 
            DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection);
        PackageInfos oPkgInfos = oPkgSQLServer.EnumPackageInfos("", true, "");
        PackageInfo oPkgInfo = oPkgInfos.Next();

        IList<DtsTask> tasks = new List<DtsTask>();
        while (!oPkgInfos.EOF)
        {
            Package2 oPkg = new Package2();
            object pVarPersistStgOfHost = new object();
            oPkg.LoadFromSQLServer(
                Settings.Default.DBServer, Settings.Default.DBUser, Settings.Default.DBPassword,
                DTSSQLServerStorageFlags.DTSSQLStgFlag_UseTrustedConnection,
                "", "", "", oPkgInfo.Name, ref pVarPersistStgOfHost);

            //IDをキーにしてConection情報をDictionaryに保存する
            IDictionary<int, Connection> connections = new Dictionary<int, Connection>();
            int connectionCount = oPkg.Connections.Count;
            for (int connKey = 1; connKey <= connectionCount; connKey++)
            {
                Connection oConnection = oPkg.Connections.Item(connKey);
                connections.Add(oConnection.ID, oConnection);
            }

            int taskCount = oPkg.Tasks.Count;
            for (int taskKey = 1; taskKey <= taskCount; taskKey++) 
            {
                Task oTask = oPkg.Tasks.Item(taskKey);
                //ここではPumpTaskだけを取得対象とする
                if (oTask.CustomTaskID == "DTSDataPumpTask")
                {
                    DtsTask dtsTask = new DtsTask();
                    tasks.Add(dtsTask);

                    dtsTask.PackageName = oPkgInfo.Name;
                    dtsTask.TaskName = oTask.Name;
                    IDictionary<string, string> taskProps = ToDictionary(oTask.Properties);
                    //Connection情報をさっき作成したDictionaryから取得する
                    int connKey = int.Parse(taskProps["SourceConnectionID"]);
                    dtsTask.SourceMdbPath = connections[connKey].DataSource;
                    dtsTask.SourceQuery = taskProps["SourceSQLStatement"];
                    dtsTask.SourceObjectName = taskProps["SourceObjectName"];
                    dtsTask.DestinationObject = taskProps["DestinationObjectName"];
                    dtsTask.DestinationQuery = taskProps["DestinationSQLStatement"];
                }
            }
            oPkg.UnInitialize();
            oPkgInfo = oPkgInfos.Next();
        }
        return tasks;
    }

    //PropertiesプロパティをDictionaryに変換して扱いやすくするメソッド
    IDictionary<string, string> ToDictionary(Properties props)
    {
        int count = props.Count;
        IDictionary<string, string> ret = new Dictionary<string, string>();
        for (int i = 1; i <= count; i++)
        {
            Property prop = props.Item(i);
            if (prop.Value == null)
            {
                ret.Add(prop.Name, null);
            }
            else
            {
                ret.Add(prop.Name, prop.Value.ToString());
            }
        }
        return ret;
    }
}