Поделиться через


Получение DbProviderFactory (ADO.NET)

Процесс получения DbProviderFactory состоит из передачи сведений о поставщике данных классу DbProviderFactories. На основе этих сведений метод GetFactory создает строго типизированную фабрику поставщика. Например, чтобы создать фабрику SqlClientFactory, можно передать методу GetFactory строку с именем поставщика, указанным в формате «System.Data.SqlClient». Другая перегрузка метода GetFactory принимает DataRow. После создания фабрики поставщика можно использовать ее методы для создания дополнительных объектов. К методам фабрики SqlClientFactory относятся CreateConnection, CreateCommand и CreateDataAdapter.

ПримечаниеПримечание

Классы .NET Framework OracleClientFactory, OdbcFactory и OleDbFactory также предоставляют похожие возможности.

Регистрация фабрик DbProviderFactory

Каждый поставщик данных .NET Framework, который поддерживает фабричный класс, регистрирует сведения о конфигурации в разделе DbProviderFactories файла machine.config на локальном компьютере. В следующем фрагменте файла конфигурации показан синтаксис и формат для 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. Он возвращает таблицу DataTable с именем DbProviderFactories, в которой содержатся столбцы, описанные в следующей таблице.

Порядковый номер столбца

Имя столбца

Пример результата

Описание

0

Name

Поставщик данных SqlClient

Понятное имя поставщика данных.

1

Description

Поставщик данных .NET Framework для 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.
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
// 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;
}

Использование файлов конфигурации приложений для хранения сведений о фабрике

Модель использования фабрик включает хранение сведений о поставщике и строке соединения в файле конфигурации приложения, например app.config для Windows-приложения и web.config для приложения ASP.NET.

В следующем фрагменте файла конфигурации демонстрируется, как сохранять две именованные строки соединения «NorthwindSQL» для соединения с базой данных Northwind в SQL Server и «NorthwindAccess» для соединения с базой данных Northwind в Access/Jet. Имя 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 (Nothing в Visual Basic). При наличии нескольких записей для поставщика возвращается первая найденная. Дополнительные сведения и примеры возвращения строк соединения из файлов конфигурации приложений см. в разделе Строки соединения и файлы конфигурации (ADO.NET).

ПримечаниеПримечание

Для выполнения этого кода необходима ссылка на файл System.Configuration.dll.

' 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
// Retrieve a connection string by specifying the providerName.
// Assumes one connection string per provider in the config file.
static string GetConnectionStringByProvider(string providerName)
{
    // Return null on failure.
    string returnValue = null;

    // 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)
                returnValue = cs.ConnectionString;
            break;
        }
    }
    return returnValue;
}

Создание DbProviderFactory и DbConnection

В этом примере демонстрируется, как создать фабрику DbProviderFactory и объект DbConnection путем передачи имени поставщика в формате «System.Data.ProviderName» и строки соединения. В случае успеха возвращается объект DbConnection; в случае любой ошибки — null (Nothing в Visual Basic).

Этот код получает DbProviderFactory путем вызова GetFactory. Затем метод CreateConnection создает объект DbConnection, а свойству ConnectionString присваивается значение строки соединения.

' 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
// 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;
}

См. также

Основные понятия

Объекты DbProviderFactory (ADO.NET)

Использование классов конфигурации

Другие ресурсы

Строки соединения (ADO.NET)