Obtendo um DbProviderFactory

O processo de obter DbProviderFactory envolve passar informações sobre um provedor de dados para a classe DbProviderFactories. Com base nessas informações, o método GetFactory cria uma fábrica de provedor fortemente tipada. Por exemplo, para criar SqlClientFactory, você pode passar para GetFactory uma cadeia de caracteres com o nome do provedor especificado como “System.Data.SqlClient”. Outra sobrecarga de GetFactory utiliza DataRow. Uma vez que você criar a fábrica de provedor, poderá usar seus métodos para criar objetos adicionais. Alguns dos métodos de SqlClientFactory incluem CreateConnection, CreateCommand e CreateDataAdapter.

Observação

As classes OracleClientFactory, OdbcFactory e OleDbFactory do .NET Framework também oferecem funcionalidade semelhante.

Registrando DbProviderFactories

Cada provedor de dados .NET Framework que dá suporte a uma classe baseada em fábrica registra informações de configuração na seção DbProviderFactories do arquivo machine.config no computador local. O fragmento do arquivo de configuração a seguir mostra a sintaxe e o formato para 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>  

O atributo invariant identifica o provedor de dados subjacente. Essa sintaxe de nomenclatura de três partes também é usada na criação de uma nova fábrica e para identificar o provedor em um arquivo de configuração de aplicativo, de forma que o nome do provedor, juntamente com a cadeia de conexão associada, possa ser recuperado em tempo de execução.

Recuperando informações sobre provedor

Você pode recuperar informações sobre todos os provedores de dados instalados no computador local usando o método GetFactoryClasses. Ele retorna uma DataTable chamada DbProviderFactories que contém as colunas descritas na tabela a seguir.

Ordinal de coluna Nome da coluna Saída de exemplo Descrição
0 Nome Provedor de Dados SqlClient Nome legível do provedor de dados
1 Descrição Provedor de Dados .Net Framework para SqlServer Descrição legível do provedor de dados
2 InvariantName System.Data.SqlClient Nome que pode ser usado programaticamente para se referir ao provedor de dados
3 AssemblyQualifiedName System.Data.SqlClient.SqlClientFactory, System.Data, Version= 2.0.0.0, = neutral, PublicKeyToken=b77a5c561934e089 Nome totalmente qualificado da classe de fábrica, que contém informações suficientes para criar uma instância do objeto

Essa DataTable pode ser usada para permitir que um usuário selecione uma DataRow em tempo de execução. A DataRow selecionada pode então ser passada para o método GetFactory para criar um DbProviderFactory fortemente tipado. Uma DataRow selecionada pode ser passada para o método GetFactory para criar o objeto DbProviderFactory desejado.

Listando as classes de fábrica de provedor instaladas

Este exemplo demonstra como usar o método GetFactoryClasses para retornar uma DataTable que contém informações sobre os provedores instalados. O código itera por cada linha na DataTable, exibindo informações para cada provedor instalado na janela do console.

// 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

Usando arquivos de configuração de aplicativo para armazenar informações da fábrica

O padrão de design usado para o trabalho com fábricas exige o armazenamento das informações de provedor e de cadeia de conexão em um arquivo de configuração do aplicativo, como app.config para um aplicativo Windows e web.config para um aplicativo ASP.NET.

O fragmento de arquivo de configuração a seguir demonstra como salvar duas cadeias de conexão nomeadas: “NorthwindSQL” para uma conexão com o banco de dados Northwind no SQL Server e “NorthwindAccess” para uma conexão com o banco de dados Northwind no Access/Jet. O nome invariant é usado para o atributo 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>  

Recuperando uma cadeia de conexão por nome de provedor

Para criar uma fábrica de provedor, você deve fornecer uma cadeia de conexão e o nome do provedor. Este exemplo demonstra como recuperar uma cadeia de conexão de um arquivo de configuração de aplicativo transmitindo o nome do provedor no formato invariável "System.Data.ProviderName". O código itera por ConnectionStringSettingsCollection. Ele retorna ProviderName em caso de êxito; caso contrário, null (Nothing no Visual Basic). Se houver várias entradas para um provedor, a primeira encontrada será retornada. Para obter mais informações e exemplos de como recuperar cadeias de conexão nos arquivos de configuração, confira Cadeias de conexão e arquivos de configuração.

Observação

Uma referência a System.Configuration.dll é necessária para que o código seja executado.

// 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

Criando DbProviderFactory e DbConnection

Este exemplo demonstra como criar um objeto DbProviderFactory e DbConnection transmitindo o nome do provedor no formato "System.Data.ProviderName" e uma cadeia de conexão. Um objeto DbConnection é retornado em caso de êxito; e null (Nothing no Visual Basic) é retornado em caso de erro.

O código obtém DbProviderFactory chamando GetFactory. Em seguida, o método CreateConnection cria o objeto DbConnection, e a propriedade ConnectionString é definida como a cadeia de conexão.

// 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

Consulte também