Compartir a través de


Obtener DbProviderFactory (ADO.NET)

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.

NotaNota

Las clases OracleClientFactory, OdbcFactory y OleDbFactory de .NET Framework 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 columna

Resultado 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.
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
// 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;
}

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.

El siguiente fragmento de archivo de configuración muestra cómo guardar dos cadenas de conexión, una denominada "NorthwindSQL", para la conexión a la base de datos Northwind de SQL Server, y la otra denominada "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>

Recuperar una cadena de conexión por el 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 sobre recuperación de cadenas de conexión desde archivos de configuración, vea Cadenas de conexión y archivos de configuración (ADO.NET)..

NotaNota

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.
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
// Retrieve a connection string by specifying the providerName.
// Assumes one connection string per provider in the config file.
static string GetConnectionStringByProvider(string providerName)
{
    // Return null on failure.
    string returnValue = null;

    // 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)
                returnValue = cs.ConnectionString;
            break;
        }
    }
    return returnValue;
}

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, 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
// 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;
}

Vea también

Conceptos

DbProviderFactories (ADO.NET)

Utilizar las clases Configuration

Otros recursos

Cadenas de conexión (ADO.NET)