Partilhar via


Obtendo um DbProviderFactory

O processo de obtenção de um DbProviderFactory envolve a passagem de informações sobre um provedor de dados para a DbProviderFactories classe. Com base nessas informações, o GetFactory método cria uma fábrica de provedor fortemente tipada. Por exemplo, para criar um SqlClientFactory, você pode passar GetFactory uma cadeia de caracteres com o nome do provedor especificado como "System.Data.SqlClient". A outra sobrecarga de GetFactory leva um DataRow. Depois de criar a fábrica do provedor, você pode usar seus métodos para criar objetos adicionais. Alguns dos métodos de um SqlClientFactory incluem CreateConnection, CreateCommand, e CreateDataAdapter.

Nota

As OracleClientFactoryclasses , OdbcFactorye OleDbFactory também fornecem funcionalidade semelhante.

Registrando DbProviderFactories

Cada provedor de dados do .NET Framework que oferece 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 do 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 invariante identifica o provedor de dados subjacente. Essa sintaxe de nomenclatura de três partes também é usada ao criar uma nova fábrica e para identificar o provedor em um arquivo de configuração de aplicativo para que o nome do provedor, juntamente com sua cadeia de conexão associada, possa ser recuperado em tempo de execução.

Recuperando informações do provedor

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

Coluna ordinal Nome da coluna Exemplo de saída Description
0 Nome Provedor de dados SqlClient Nome legível para o provedor de dados
1 Descrição Provedor de dados .Net Framework para SqlServer Descrição legível do fornecedor 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, Culture=neutral, PublicKeyToken=b77a5c561934e089 Nome totalmente qualificado da classe de fábrica, que contém informações suficientes para instanciar o objeto

Isso DataTable pode ser usado para permitir que um usuário selecione um DataRow em tempo de execução. O selecionado DataRow pode então ser passado para o GetFactory método para criar um fortemente tipado DbProviderFactory. Um selecionado DataRow pode ser passado para o GetFactory método para criar o objeto desejado DbProviderFactory .

Listando as classes de fábrica do provedor instalado

Este exemplo demonstra como usar o GetFactoryClasses método para retornar um DataTable contendo informações sobre os provedores instalados. O código itera através de cada linha no 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 do aplicativo para armazenar informações de fábrica

O padrão de design usado para trabalhar com fábricas envolve o armazenamento de informações do provedor e da cadeia de conexão em um arquivo de configuração do aplicativo, como app.config para um aplicativo do 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 invariante é 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>

Importante

A Microsoft recomenda que você use o fluxo de autenticação mais seguro disponível. Se você estiver se conectando ao SQL do Azure, as Identidades Gerenciadas para recursos do Azure serão o método de autenticação recomendado.

Recuperar uma cadeia de conexão por nome de provedor

Para criar uma fábrica de provedores, você deve fornecer uma cadeia de conexão, bem como o nome do provedor. Este exemplo demonstra como recuperar uma cadeia de conexão de um arquivo de configuração de aplicativo passando o nome do provedor no formato invariante "System.Data.ProviderName". O código itera através do ConnectionStringSettingsCollection. Ele retorna o ProviderName on success; 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 recuperação de cadeias de conexão de arquivos de configuração, consulte Cadeias de conexão e arquivos de configuração.

Nota

Uma referência a é necessária para System.Configuration.dll 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 o DbProviderFactory e o DbConnection

Este exemplo demonstra como criar um DbProviderFactory objeto e DbConnection passando-lhe o nome do provedor no formato "System.Data.ProviderName" e uma cadeia de conexão. Um DbConnection objeto é retornado com sucesso; null Nothing ( no Visual Basic) em qualquer erro.

O código obtém o DbProviderFactory chamando GetFactory. Em seguida, o CreateConnection método cria o DbConnection objeto e a ConnectionString propriedade é 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