DbProviderFactory の取得
DbProviderFactory を取得する過程では、データ プロバイダーに関する情報が DbProviderFactories クラスに渡されます。 GetFactory メソッドはこの情報に基づいて、厳密に型指定されたプロバイダー ファクトリを作成します。 たとえば、SqlClientFactory を作成するには、GetFactory
の引数にプロバイダー名 System.Data.SqlClient を文字列として指定します。 GetFactory
には、DataRow を引数として受け取るオーバーロードも存在します。 プロバイダー ファクトリを作成すると、対応するメソッドを使って他のオブジェクトを作成できるようになります。 SqlClientFactory
のメソッドには、CreateConnection、CreateCommand、CreateDataAdapter などがあります。
Note
同様の機能は、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 を選択してもらうことができます。 次に、選択された DataRow
を GetFactory メソッドに渡すことで、厳密に型指定された DbProviderFactory を作成できます。 選択された DataRow を GetFactory
メソッドに渡すことによって、目的の 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>
重要
Microsoft では、使用可能な最も安全な認証フローを使用することをお勧めします。 Azure SQL に接続する場合は、Azure リソースの管理 ID が推奨される認証方法です。
接続文字列をプロバイダー名で取得する
プロバイダー ファクトリを作成するには、プロバイダー名だけでなく接続文字列も指定する必要があります。 次の例では、プロバイダー名を "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