カスタム接続マネージャのコーディング
ConnectionManagerBase 基本クラスを継承するクラスを作成し、DtsConnectionAttribute 属性をそのクラスに適用したら、基本クラスのプロパティとメソッドの実装をオーバーライドして、カスタム機能を提供する必要があります。
メモ : |
---|
カスタム接続マネージャの実際のサンプルについては、「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();
}
参照
処理手順
カスタム接続マネージャの作成
カスタム接続マネージャ用ユーザー インターフェイスの開発