Recupero di un oggetto DbProviderFactory

Il processo di recupero di un oggetto DbProviderFactory implica il passaggio delle informazioni su un provider di dati alla classe DbProviderFactories. Sulla base di queste informazioni, il metodo GetFactory crea una factory del provider fortemente tipizzata. Ad esempio, per creare un oggetto SqlClientFactory, è possibile passare a GetFactory una stringa contenente il nome del provider specificato come "System.Data.SqlClient". L'altro overload di GetFactory accetta un oggetto DataRow. Dopo aver creato la factory del provider, è quindi possibile usarne i metodi per creare altri oggetti. I metodi di un oggetto SqlClientFactory includono CreateConnection, CreateCommande CreateDataAdapter.

Nota

Anche le classi OracleClientFactory, OdbcFactory e OleDbFactory di .NET Framework forniscono funzionalità analoghe.

Registrazione in DbProviderFactories

Ogni provider di dati .NET Framework che supporta una classe basata su factory registra le informazioni di configurazione nella sezione DbProviderFactories del file machine.config del computer locale. Nel frammento di file di configurazione seguente sono illustrati la sintassi e il formato di 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>  

L'attributo invariant identifica il provider di dati sottostante. La sintassi di denominazione in tre parti viene inoltre usata durante la creazione di una nuova factory e per l'identificazione del provider in un file di configurazione dell'applicazione in modo da consentire il recupero del nome del provider, unitamente alla stringa di connessione associata, in fase di esecuzione.

Recupero di informazioni sul provider

È possibile recuperare informazioni su tutti i provider di dati installati nel computer locale usando il metodo GetFactoryClasses. Tale metodo DataTable restituisce un oggetto denominato DbProviderFactories che contiene le colonne descritte nella tabella seguente.

Ordinale colonna Nome colonna Output di esempio Descrizione
0 Nome Provider di dati SqlClient Nome leggibile del provider di dati
1 Descrizione Provider di dati .NET Framework per SQL Server Descrizione leggibile del provider di dati
2 InvariantName System.Data.SqlClient Nome da usare a livello di codice per fare riferimento al provider di dati
3 AssemblyQualifiedName System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Nome completo della classe factory, che contiene informazioni sufficienti per creare un'istanza dell'oggetto

È possibile usare un oggetto DataTable per consentire a un utente di selezionare un oggetto DataRow in fase di esecuzione. È quindi possibile passare l'oggetto DataRow selezionato al metodo GetFactory per creare un oggetto DbProviderFactory fortemente tipizzato. È possibile passare un oggetto DataRow selezionato al metodo GetFactory per creare l'oggetto DbProviderFactory desiderato.

Visualizzazione dell'elenco delle classi del factory di provider installate

In questo esempio viene illustrato l'uso del metodo GetFactoryClasses per restituire un oggetto DataTable che contiene informazioni sui provider installati. Il codice consente di scorrere le singole righe dell'oggetto DataTable, visualizzando le informazioni su ogni provider installato nella finestra della 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

Utilizzo dei file di configurazione dell'archiviazione per archiviare le informazioni sulla factory

Lo schema progettuale usato per la gestione delle factory prevede l'archiviazione delle informazioni relative al provider e alla stringa di connessione in un file di configurazione dell'applicazione, ad esempio app.config per un'applicazione Windows e web.config per un'applicazione ASP.NET.

Nel frammento del file di configurazione seguente viene illustrato come salvare due stringhe di connessione denominate rispettivamente "NorthwindSQL" per una connessione al database Northwind in SQL Server e "NorthwindAccess" per una connessione al database Northwind in Access/Jet. Per l'attributo providerName viene usato il nome invariant.

<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>  

Recupero di una stringa di connessione dal nome del provider

Per creare una factory del provider, è necessario fornire una stringa di connessione oltre al nome del provider. In questo esempio viene illustrato come recuperare una stringa di connessione da un file di configurazione dell'applicazione passando il nome del provider nel formato invariant "System.Data.ProviderName". Il codice consente di scorrere gli elementi di ConnectionStringSettingsCollection. In caso di esito positivo, restituisce ProviderName; in caso contrario, restituisce null (Nothing in Visual Basic). Se per un provider sono disponibili più stringhe, viene restituita la prima stringa trovata. Per altre informazioni ed esempi di recupero delle stringhe di connessione dai file di configurazione, vedere Stringhe di connessione e file di configurazione.

Nota

Per consentire l'esecuzione del codice, è necessario un riferimento a System.Configuration.dll.

// 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

Creazione di oggetti DbProviderFactory e DbConnection

In questo esempio viene illustrato come creare un oggetto DbProviderFactory e DbConnection passando ad essi il nome del provider in formato "System.Data.ProviderName" e una stringa di connessione. In caso di esito positivo, viene restituito un oggetto DbConnection; in caso di errore, viene restituito null (Nothing in Visual Basic).

Il codice ottiene l'oggetto DbProviderFactory mediante una chiamata a GetFactory. Il metodo CreateConnection crea quindi l'oggetto DbConnection e la proprietà ConnectionString viene impostata sulla stringa di connessione.

// 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

Vedi anche