获取 DbProviderFactory

获取 DbProviderFactory 的过程涉及将有关数据提供程序的信息传递给 DbProviderFactories 类。 GetFactory 方法将基于此信息创建一个强类型提供程序工厂。 例如,若要创建 SqlClientFactory,可以向 GetFactory 传递一个将提供程序名称指定为“System.Data.SqlClient”的字符串。 GetFactory 的其他重载采用 DataRow。 创建该提供程序工厂后,可以使用其方法创建其他对象。 SqlClientFactory 的部分方法包括 CreateConnectionCreateCommandCreateDataAdapter

备注

.NET Framework OracleClientFactoryOdbcFactoryOleDbFactory 类也提供类似功能。

注册 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 属性标识基础数据提供程序。 在创建新工厂时也使用这种由三部分组成的命名语法,并用于标识应用程序配置文件中的提供程序,以便在运行时能够检索提供程序名称及其关联的连接字符串。

检索提供程序信息

使用 GetFactoryClasses 方法可以检索有关安装在本地计算机上的所有数据提供程序的信息。 它会返回一个名为“DbProviderFactories”的 DataTable,其中包含下表中说明的列。

列序号 列名称 示例输出 说明
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 工厂类的完全限定名称,其中包含实例化对象所需的足够信息

使用此 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”)中存储提供程序和连接字符串信息。

下面的配置文件片段演示如何保存两个命名连接字符串:用于连接到 SQL Server 中 Northwind 数据库的“NorthwindSQL”和用于连接到 Access/Jet 中 Northwind 数据库的“NorthwindAccess”。 “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>  

按提供程序名称检索连接字符串

若要创建提供程序工厂,必须提供连接字符串和提供程序名称。 此示例演示如何通过以“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

另请参阅