共用方式為


取得 DbProviderFactory

取得 DbProviderFactory 的程序包含傳遞資料提供者的相關資訊給 DbProviderFactories 類別。 根據這項資訊,GetFactory 方法會建立強型別 (Strongly Typed) 提供者 Factory。 例如,若要建立 SqlClientFactory,您可以將提供者名稱指定為 "System.Data.SqlClient" 的字串傳遞給 GetFactoryGetFactory 的其他多載會接受 DataRow。 一旦您建立了提供者 Factory,之後就可以使用其方法來建立其他物件。 SqlClientFactory 的某些方法包括 CreateConnectionCreateCommandCreateDataAdapter

注意

OracleClientFactory, OdbcFactoryOleDbFactory 類別也會提供類似的功能。

註冊 DbProviderFactories

每個支援以 Factory 為基礎之類別的 .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 屬性可識別底層資料提供者。 這個三部分命名語法也會用於建立新的 Factory 以及在應用程式組態檔中識別提供者,如此您就可以在執行階段擷取提供者名稱及其相關聯的連接字串。

擷取提供者資訊

您可以使用 GetFactoryClasses 方法,擷取本機電腦上所安裝之所有資料提供者的相關資訊。 它會傳回名為 DbProviderFactoriesDataTable,其中包含下表所述的資料行。

資料行序數 資料行名稱 範例輸出 描述
0 名稱 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 Factory 類別的完整名稱,其中包含具現化物件的足夠資訊

這個 DataTable 可用來讓使用者在執行階段選取 DataRow。 然後,選取的 DataRow 可傳遞給 GetFactory 方法,以便建立強型別 DbProviderFactory。 選取的 DataRow 可傳遞給 GetFactory 方法,以便建立所需的 DbProviderFactory 物件。

列出已安裝的提供者 Factory 類別

這個範例將說明如何使用 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

使用應用程式組態檔來儲存 Factory 資訊

用於處理 Factory 的設計模式需要將提供者和連接字串資訊儲存在應用程式組態檔中,例如 Windows 應用程式的 app.config 和 ASP.NET 應用程式的 web.config

下列組態檔片段將說明如何儲存兩個具名連接字串:"NorthwindSQL" 代表 SQL Server 中 Northwind 資料庫的連接,而 "NorthwindAccess" 代表 Access/Jet 中 Northwind 資料庫的連接。 invariant 名稱用於 providerName 屬性。

<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 資源受控識別

依提供者名稱擷取連接字串

為了建立提供者 Factory,您必須提供連接字串以及提供者名稱。 這則範例將說明如何透過以 "System.Data.ProviderName" 非變異格式來傳遞提供者名稱,從應用程式組態檔中擷取連接字串。 此程式碼會逐一查看 ConnectionStringSettingsCollection。 然後,如果成功,它就會傳回 ProviderName,否則便傳回 null (在 Visual Basic 中為 Nothing)。 如果某個提供者有多個項目,就會傳回第一個找到的項目。 如需從組態檔擷取連接字串的詳細資訊和範例,請參閱連接字串與組態檔

注意

您必須使用 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" 格式來傳遞提供者名稱和連接字串,建立 DbProviderFactoryDbConnection 物件。 如果成功,它就會傳回 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

另請參閱