カスタム接続マネージャのコーディング

ConnectionManagerBase 基本クラスを継承するクラスを作成し、DtsConnectionAttribute 属性をそのクラスに適用したら、基本クラスのプロパティとメソッドの実装をオーバーライドして、カスタム機能を提供する必要があります。

ms403357.note(ja-jp,SQL.90).gifメモ :
カスタム接続マネージャの実際のサンプルについては、「SQL Server Custom Connection Manager サンプル」および「Excel2 Custom Connection Manager サンプル」を参照してください。 なお、このトピックのコード例は、Sql Server Custom Connection Manager サンプルを基にしています。

接続マネージャの構成

ConnectionString プロパティの設定

ConnectionString プロパティは重要なプロパティです。このプロパティだけが、カスタム接続マネージャごとに一意です。接続マネージャは、このプロパティの値を使用して、外部のデータ ソースへ接続します。サーバー名やデータベース名など、他の複数のプロパティを組み合わせて接続文字列を作成する場合は、接続文字列テンプレートの一部の値をユーザー指定による新しい値に置き換えることによって文字列をアセンブルするためのヘルパ関数を使用できます。

  ' Default values.
  Private _serverName As String = "(local)"
  Private _databaseName As String = "AdventureWorks"
  Private _connectionString As String = String.Empty

  Private Const CONNECTIONSTRING_TEMPLATE As String = _
    "Data Source=<servername>;Initial Catalog=<databasename>;Integrated Security=SSPI"

  Public Property ServerName() As String
    Get
      Return _serverName
    End Get
    Set(ByVal value As String)
      _serverName = value
    End Set
  End Property

  Public Property DatabaseName() As String
    Get
      Return _databaseName
    End Get
    Set(ByVal value As String)
      _databaseName = value
    End Set
  End Property

  Public Overrides Property ConnectionString() As String
    Get
      UpdateConnectionString()
      Return _connectionString
    End Get
    Set(ByVal value As String)
      _connectionString = value
    End Set
  End Property

  Private Sub UpdateConnectionString()

    Dim temporaryString As String = CONNECTIONSTRING_TEMPLATE

    If Not String.IsNullOrEmpty(_serverName) Then
      temporaryString = temporaryString.Replace("<servername>", _serverName)
    End If
    If Not String.IsNullOrEmpty(_databaseName) Then
      temporaryString = temporaryString.Replace("<databasename>", _databaseName)
    End If

    _connectionString = temporaryString

  End Sub
    // Default values.
    private string _serverName = "(local)";
    private string _databaseName = "AdventureWorks";
    private string _connectionString = String.Empty;

    private const string CONNECTIONSTRING_TEMPLATE = "Data Source=<servername>;Initial Catalog=<databasename>;Integrated Security=SSPI";

    public string ServerName
    {
      get
      {
        return _serverName;
      }
      set
      {
        _serverName = value;
      }
    }

    public string DatabaseName
    {
      get
      {
        return _databaseName;
      }
      set
      {
        _databaseName = value;
      }
    }

    public override string ConnectionString
    {
      get
      {
        UpdateConnectionString();
        return _connectionString;
      }
      set
      {
        _connectionString = value;
      }
    }

    private void UpdateConnectionString()
    {

      string temporaryString = CONNECTIONSTRING_TEMPLATE;

      if (!String.IsNullOrEmpty(_serverName))
      {
        temporaryString = temporaryString.Replace("<servername>", _serverName);
      }

      if (!String.IsNullOrEmpty(_databaseName))
      {
        temporaryString = temporaryString.Replace("<databasename>", _databaseName);
      }

      _connectionString = temporaryString;

    }

接続マネージャの検証

接続マネージャが正しく構成されたことを確認するには、Validate メソッドをオーバーライドします。少なくとも、接続文字列の形式を検証し、すべての引数に値が指定されていることを確認してください。接続マネージャが Validate メソッドから Success を返すまでは、実行を続行できません。

次のコード例は、接続用のサーバー名がユーザーによって指定されていることを確認する Validate の実装を示します。

  Public Overrides Function Validate(ByVal infoEvents As Microsoft.SqlServer.Dts.Runtime.IDTSInfoEvents) As Microsoft.SqlServer.Dts.Runtime.DTSExecResult

    If String.IsNullOrEmpty(_serverName) Then
      infoEvents.FireError(0, "SqlConnectionManager", "No server name specified", String.Empty, 0)
      Return DTSExecResult.Failure
    Else
      Return DTSExecResult.Success
    End If

  End Function
    public override Microsoft.SqlServer.Dts.Runtime.DTSExecResult Validate(Microsoft.SqlServer.Dts.Runtime.IDTSInfoEvents infoEvents)
    {

      if (String.IsNullOrEmpty(_serverName))
      {
        infoEvents.FireError(0, "SqlConnectionManager", "No server name specified", String.Empty, 0);
        return DTSExecResult.Failure;
      }
      else
      {
        return DTSExecResult.Success;
      }

    }

接続マネージャの保存

通常、接続マネージャに対して、カスタムの永続性を実装する必要はありません。カスタムの永続性は、オブジェクトのプロパティで複合データ型が使用されている場合にのみ必要です。詳細については、「Integration Services 用のカスタム オブジェクトの開発」を参照してください。

外部データ ソースの使用

外部データ ソースへの接続をサポートするメソッドは、カスタム接続マネージャにとって非常に重要なメソッドです。AcquireConnection メソッドおよび ReleaseConnection メソッドは、デザイン時と実行時のさまざまな時点で呼び出されます。

接続の取得

AcquireConnection メソッドの使用時にカスタム接続マネージャが返すオブジェクトについて、適切な種類を決定する必要があります。たとえば、ファイル接続マネージャは、パスとファイル名が含まれた文字列のみを返し、ADO.NET 接続マネージャは、既に開いているマネージ接続オブジェクトを返します。OLE DB 接続マネージャは、マネージ コードから使用できないネイティブの OLE DB 接続オブジェクトを返します。このトピック内のコード スニペットの基になっているカスタム SQL Server 接続マネージャは、開いている SqlConnection オブジェクトを返します。

接続マネージャのユーザーは、返されるオブジェクトを適切な種類にキャストし、そのメソッドとプロパティにアクセスできるよう、オブジェクトの種類をあらかじめ知っておく必要があります。

  Public Overrides Function AcquireConnection(ByVal txn As Object) As Object

    Dim sqlConnection As New SqlConnection

    UpdateConnectionString()

    With sqlConnection
      .ConnectionString = _connectionString
      .Open()
    End With

    Return sqlConnection

  End Function
    public override object AcquireConnection(object txn)
    {

      SqlConnection sqlConnection = new SqlConnection();

      UpdateConnectionString();

      {
        sqlConnection.ConnectionString = _connectionString;
        sqlConnection.Open();
      }

      return sqlConnection;

    }

接続の解放

ReleaseConnection メソッドでのアクションは、AcquireConnection メソッドから返されたオブジェクトの種類によって異なります。開いている接続オブジェクトがあれば、それを閉じて、使用中のリソースを解放してください。AcquireConnection から文字列値のみが返された場合、必要なアクションはありません。

  Public Overrides Sub ReleaseConnection(ByVal connection As Object)

    Dim sqlConnection As SqlConnection

    sqlConnection = DirectCast(connection, SqlConnection)

    If sqlConnection.State <> ConnectionState.Closed Then
      sqlConnection.Close()
    End If

  End Sub
    public override void ReleaseConnection(object connection)
    {
      SqlConnection sqlConnection;
      sqlConnection = (SqlConnection)connection;
      if (sqlConnection.State != ConnectionState.Closed)
        sqlConnection.Close();
    }

参照

処理手順

カスタム接続マネージャの作成
カスタム接続マネージャ用ユーザー インターフェイスの開発

ヘルプおよび情報

SQL Server 2005 の参考資料の入手