Obtener un objeto DbProviderFactory
El proceso de obtención de DbProviderFactory implica pasar información sobre un proveedor de datos a la clase DbProviderFactories. En función de esta información, el método GetFactory crea un generador del proveedor fuertemente tipado. Por ejemplo, para crear SqlClientFactory, se puede pasar a GetFactory
una cadena con el nombre de proveedor especificado como "System.Data.SqlClient". La otra sobrecarga de GetFactory
toma DataRow. Una vez creado el generador del proveedor, se pueden utilizar sus métodos para crear objetos adicionales. Entre los métodos de SqlClientFactory
se incluyen CreateConnection, CreateCommand y CreateDataAdapter.
Nota:
Las clases OracleClientFactory, OdbcFactory y OleDbFactory también proporcionan una funcionalidad similar.
Registrar DbProviderFactories
Todos los proveedores de datos .NET Framework que admiten una clase basada en generador registran información de configuración en la sección DbProviderFactories del archivo machine.config del equipo local. El siguiente fragmento del archivo de configuración muestra la sintaxis y formato de 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>
El atributo invariant identifica el proveedor de datos subyacente. Esta sintaxis de nomenclatura en tres partes también se utiliza al crear un nuevo generador y para identificar al proveedor en un archivo de configuración de la aplicación, de manera que el nombre de proveedor, junto con sus cadenas de conexión asociadas, se puedan recuperar en tiempo de conexión.
Recuperar información del proveedor
Se puede recuperar información acerca de todos los proveedores de datos instalados en el equipo local utilizando el método GetFactoryClasses. Devuelve un DataTable denominado DbProviderFactories que contiene las columnas descritas en la tabla siguiente.
Índice de columna | Nombre de la columna | Salida de ejemplo | Descripción |
---|---|---|---|
0 | Nombre | Proveedor de datos SqlClient | Nombre legible del proveedor de datos |
1 | Descripción | Proveedor de datos .NET Framework para SqlServer | Descripción legible del proveedor de datos |
2 | InvariantName | System.Data.SqlClient | Nombre que se puede utilizar mediante programación para hacer referencia al proveedor de datos |
3 | AssemblyQualifiedName | System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | Nombre completo de la clase de generador, el cual tiene información suficiente para crear la instancia del objeto |
Este DataTable
se puede utilizar para permitir a un usuario seleccionar un DataRow en tiempo de ejecución. El DataRow
seleccionado se puede pasar al método GetFactory para crear un DbProviderFactory fuertemente tipado. Un DataRow seleccionado se puede pasar al método GetFactory
para crear el objeto DbProviderFactory
deseado.
Enumerar las clases de generador del proveedor instaladas
Este ejemplo muestra cómo el método GetFactoryClasses devuelve un DataTable con información sobre los proveedores instalados. El código recorre en iteración cada fila de DataTable
y muestra información de todos los proveedores instalados en la ventana de la consola.
// 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
Utilizar archivos de configuración de la aplicación para almacenar información del generador
El patrón de diseño utilizado para trabajar con generadores implica almacenar información de cadena de conexión y proveedor en un archivo de configuración de la aplicación, como app.config para una aplicación Windows y web.config para una aplicación ASP.NET.
En el siguiente fragmento de archivo de configuración se ve cómo guardar dos cadenas de conexión: "NorthwindSQL", para la conexión a la base de datos Northwind de SQL Server y "NorthwindAccess", para una conexión a la base de datos Northwind de Access/Jet. El nombre invariant se utiliza para el 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
Microsoft recomienda usar el flujo de autenticación más seguro disponible. Si se conecta a Azure SQL, el método de autenticación recomendado es Identidades administradas para recursos de Azure.
Recuperar una cadena de conexión por nombre de proveedor
Para crear un generador del proveedor, debe proporcionar una cadena de conexión, así como el nombre del proveedor. Este ejemplo muestra cómo recuperar una cadena de conexión desde un archivo de configuración de la aplicación pasando el nombre del proveedor en el formato invariable "System.Data.ProviderName". El código recorre en iteración ConnectionStringSettingsCollection. Devuelve correctamente ProviderName; en caso contrario, null
(Nothing
en Visual Basic). Si existen varias entradas para un proveedor, se devuelve la primera que se encuentra. Para obtener más información y ejemplos de recuperación de cadenas de conexión de archivos de configuración, vea Cadenas de conexión y archivos de configuración.
Nota
Se necesita una referencia a System.Configuration.dll
para que se ejecute el código.
// 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
Crear DbProviderFactory y DbConnection
Este ejemplo muestra cómo crear un objeto DbProviderFactory y DbConnection pasando el nombre del proveedor en el formato "System.Data.ProviderName" y una cadena de conexión. Se devuelve correctamente un objeto DbConnection
; null
(Nothing
en Visual Basic), en caso de producirse un error.
El código obtiene DbProviderFactory
llamando a GetFactory. Entonces, el método CreateConnection crea el objeto DbConnection y la propiedad ConnectionString se establece en la cadena de conexión.
// 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