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