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 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 em 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>
Importante
A Microsoft recomenda usar 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 é o método de autenticação recomendado.
Recuperar uma cadeia de conexão pelo nome do 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