DbProviderFactory の取得

DbProviderFactory を取得する過程では、データ プロバイダーに関する情報が DbProviderFactories クラスに渡されます。 GetFactory メソッドはこの情報に基づいて、厳密に型指定されたプロバイダー ファクトリを作成します。 たとえば、SqlClientFactory を作成するには、GetFactory の引数にプロバイダー名 System.Data.SqlClient を文字列として指定します。 GetFactory には、DataRow を引数として受け取るオーバーロードも存在します。 プロバイダー ファクトリを作成すると、対応するメソッドを使って他のオブジェクトを作成できるようになります。 SqlClientFactory のメソッドには、CreateConnectionCreateCommandCreateDataAdapter などがあります。

Note

同様の機能は、.NET Framework の OracleClientFactory クラス、OdbcFactory クラス、および OleDbFactory クラスにも用意されています。

DbProviderFactory の登録

ファクトリ ベースのクラスをサポートする各 .NET Framework データ プロバイダーは、ローカル コンピューターの machine.config ファイルの DbProviderFactories セクションに構成情報を登録します。 次の構成ファイル フラグメントは、System.Data.SqlClient の構文と形式を示しています。

<system.data>  
  <DbProviderFactories>  
    <add name="SqlClient Data Provider"  
     invariant="System.Data.SqlClient"
     description=".Net Framework Data Provider for SqlServer"
     type="System.Data.SqlClient.SqlClientFactory, System.Data,
     Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"  
    />  
  </DbProviderFactories>  
</system.data>  

基になるデータ プロバイダーは invariant 属性によって識別されます。 この 3 つの部分から成る命名構文は、新しいファクトリを作成するときのほか、プロバイダー名とそれに関連付けられた接続文字列を実行時に取得できるようにするために、アプリケーションの構成ファイルでプロバイダーを指定するときにも使用されます。

プロバイダー情報の取得

GetFactoryClasses メソッドを使用すると、ローカル コンピューターにインストールされているすべてのデータ プロバイダーに関する情報を取得できます。 このメソッドでは、DbProviderFactories という名前の DataTable が返されます。このテーブルに含まれる列を次の表に示します。

列の序数 列名 サンプルの出力 説明
0 Name SqlClient Data Provider データ プロバイダーの読み取り可能な名前
1 説明 .Net Framework Data Provider for SqlServer データ プロバイダーの読み取り可能な説明
2 InvariantName System.Data.SqlClient プログラムでデータ プロバイダーの参照に使用できる名前
3 AssemblyQualifiedName System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 オブジェクトをインスタンス化するための十分な情報を保持している、ファクトリ クラスの完全修飾名

この DataTable を使用して、ユーザーに実行時に DataRow を選択してもらうことができます。 次に、選択された DataRowGetFactory メソッドに渡すことで、厳密に型指定された DbProviderFactory を作成できます。 選択された DataRowGetFactory メソッドに渡すことによって、目的の DbProviderFactory オブジェクトを作成できます。

インストールされているプロバイダー ファクトリ クラスの一覧表示

次の例では、インストールされているプロバイダーの情報を含んだ GetFactoryClasses を、DataTable メソッドを使用して取得します。 このコードは、DataTable 内の各行を反復処理しながら、インストールされている各プロバイダーの情報をコンソール ウィンドウに表示します。

// This example assumes a reference to System.Data.Common.
static DataTable GetProviderFactoryClasses()
{
    // Retrieve the installed providers and factories.
    DataTable table = DbProviderFactories.GetFactoryClasses();

    // Display each row and column value.
    foreach (DataRow row in table.Rows)
    {
        foreach (DataColumn column in table.Columns)
        {
            Console.WriteLine(row[column]);
        }
    }
    return table;
}
' This example assumes a reference to System.Data.Common.
Private Shared Function GetProviderFactoryClasses() As DataTable

    ' Retrieve the installed providers and factories.
    Dim table As DataTable = DbProviderFactories.GetFactoryClasses()

    ' Display each row and column value.
    Dim row As DataRow
    Dim column As DataColumn
    For Each row In table.Rows
        For Each column In table.Columns
            Console.WriteLine(row(column))
        Next
    Next

    Return table
End Function

アプリケーション構成ファイルを使用したファクトリ情報の保存

ファクトリを使用したデザイン パターンでは、プロバイダーや接続文字列の情報をアプリケーション構成ファイルに保存する必要があります。たとえば、Windows アプリケーションの場合は app.config に、ASP.NET アプリケーションの場合は web.config に、これらの情報を保存することになります。

次の構成ファイル フラグメントは、2 つの名前付き接続文字列 (SQL Server の Northwind データベースに接続するための "NorthwindSQL" と、Access/Jet の Northwind データベースに接続するための "NorthwindAccess") を保存する例を示したものです。 providerName 属性には invariant の名前が使用されています。

<configuration>  
  <connectionStrings>  
    <clear/>  
    <add name="NorthwindSQL"
     providerName="System.Data.SqlClient"
     connectionString=  
     "Data Source=MSSQL1;Initial Catalog=Northwind;Integrated Security=true"  
    />  
  
    <add name="NorthwindAccess"
     providerName="System.Data.OleDb"
     connectionString=  
     "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Data\Northwind.mdb;"  
    />  
  </connectionStrings>  
</configuration>  

プロバイダー名による接続文字列の取得

プロバイダー ファクトリを作成するには、プロバイダー名だけでなく接続文字列も指定する必要があります。 次の例では、プロバイダー名を "System.Data.ProviderName" という不変名で渡すことによってアプリケーション構成ファイルから接続文字列を取得します。 このコードでは、ConnectionStringSettingsCollection を反復処理しています。 成功した場合には ProviderName が、それ以外の場合は null (Visual Basic の場合は Nothing) が返されます。 プロバイダーに複数のエントリが存在した場合は、最初に見つかったエントリが返されます。 構成ファイルからの接続文字列の取得およびその例については、「接続文字列と構成ファイル」を参照してください。

Note

このコードを実行するには、System.Configuration.dll を参照設定する必要があります。

// Retrieve a connection string by specifying the providerName.
// Assumes one connection string per provider in the config file.
static string? GetConnectionStringByProvider(string providerName)
{
    // Get the collection of connection strings.
    ConnectionStringSettingsCollection? settings =
        ConfigurationManager.ConnectionStrings;

    // Walk through the collection and return the first
    // connection string matching the providerName.
    if (settings != null)
    {
        foreach (ConnectionStringSettings cs in settings)
        {
            if (cs.ProviderName == providerName)
            {
                return cs.ConnectionString;
            }
        }
    }
    return null;
}
' Retrieve a connection string by specifying the providerName.
' Assumes one connection string per provider in the config file.
Private Shared Function GetConnectionStringByProvider( _
    ByVal providerName As String) As String

    'Return Nothing on failure.
    Dim returnValue As String = Nothing

    ' Get the collection of connection strings.
    Dim settings As ConnectionStringSettingsCollection = _
        ConfigurationManager.ConnectionStrings

    ' Walk through the collection and return the first 
    ' connection string matching the providerName.
    If Not settings Is Nothing Then
        For Each cs As ConnectionStringSettings In settings
            If cs.ProviderName = providerName Then
                returnValue = cs.ConnectionString
                Exit For
            End If
        Next
    End If

    Return returnValue
End Function

DbProviderFactory および DbConnection の作成

次の例では、"System.Data.ProviderName" 形式のプロバイダー名と接続文字列を引数として渡すことによって、DbProviderFactory および DbConnection オブジェクトを作成する方法を示します。 成功した場合には DbConnection オブジェクトが返されます。エラーが発生した場合は null (Visual Basic の場合は Nothing) が返されます。

このコードでは、DbProviderFactory を呼び出すことによって GetFactory を取得しています。 次に、CreateConnection メソッドで DbConnection オブジェクトを作成し、ConnectionString プロパティに接続文字列を設定します。

// Given a provider name and connection string,
// create the DbProviderFactory and DbConnection.
// Returns a DbConnection on success; null on failure.
static DbConnection CreateDbConnection(
    string providerName, string connectionString)
{
    // Assume failure.
    DbConnection connection = null;

    // Create the DbProviderFactory and DbConnection.
    if (connectionString != null)
    {
        try
        {
            DbProviderFactory factory =
                DbProviderFactories.GetFactory(providerName);

            connection = factory.CreateConnection();
            connection.ConnectionString = connectionString;
        }
        catch (Exception ex)
        {
            // Set the connection to null if it was created.
            if (connection != null)
            {
                connection = null;
            }
            Console.WriteLine(ex.Message);
        }
    }
    // Return the connection.
    return connection;
}
' Given a provider, create a DbProviderFactory and DbConnection.
' Returns a DbConnection on success; Nothing on failure.
Private Shared Function CreateDbConnection( _
    ByVal providerName As String, ByVal connectionString As String) _
    As DbConnection

    ' Assume failure.
    Dim connection As DbConnection = Nothing

    ' Create the DbProviderFactory and DbConnection.
    If Not connectionString Is Nothing Then
        Try
            Dim factory As DbProviderFactory = _
               DbProviderFactories.GetFactory(providerName)

            connection = factory.CreateConnection()
            connection.ConnectionString = connectionString

        Catch ex As Exception
            ' Set the connection to Nothing if it was created.
            If Not connection Is Nothing Then
                connection = Nothing
            End If
            Console.WriteLine(ex.Message)
        End Try
    End If

    ' Return the connection.
    Return connection
End Function

関連項目