Obtention d'un DbProviderFactory

Le processus d'obtention d'un objet DbProviderFactory implique de passer des informations à propos d'un fournisseur de données à la classe DbProviderFactories. En fonction de ces informations, la méthode GetFactory crée une fabrique de fournisseurs fortement typée. Par exemple, pour créer un objet SqlClientFactory, vous pouvez passer à GetFactory une chaîne avec le nom du fournisseur spécifié comme « System.Data.SqlClient ». L'autre surcharge de GetFactory prend un objet DataRow. Une fois que vous avez créé la fabrique de fournisseurs, vous pouvez ensuite utiliser ses méthodes pour créer des objets supplémentaires. Parmi les méthodes d'un SqlClientFactory, citons CreateConnection, CreateCommand et CreateDataAdapter.

Notes

Les objets OracleClientFactory, OdbcFactory .NET Framework et les classes OleDbFactory fournissent des fonctionnalités similaires.

Inscription de DbProviderFactories

Chaque fournisseur de données .NET Framework qui prend en charge une classe fondée sur les fabriques enregistre les informations de configuration dans la section DbProviderFactories du fichier machine.config sur l’ordinateur local. Le fragment de fichier de configuration suivant montre la syntaxe et le format 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>  

L’attribut invariant identifie le fournisseur de données sous-jacent. Cette syntaxe d'attribution de nom en trois parties est également utilisée lors de la création d'une fabrique et pour l'identification du fournisseur dans un fichier de configuration d'application de manière à ce que le nom du fournisseur, ainsi que sa chaîne de connexion associée, puissent être récupérés au moment de l'exécution.

Récupération des informations relatives aux fournisseurs

Vous pouvez récupérer les informations relatives à tous les fournisseurs de données installés sur l'ordinateur local à l'aide de la méthode GetFactoryClasses. Celle-ci retourne un objet DataTable nommé DbProviderFactories contenant les colonnes décrites dans le tableau suivant.

Numéro de colonne Nom de la colonne Exemple de sortie Description
0 Nom Fournisseur de données SqlClient Nom lisible pour le fournisseur de données
1 Description Fournisseur de données .NET Framework pour SqlServer Description lisible pour le fournisseur de données
2 InvariantName System.Data.SqlClient Nom qui peut être utilisé de façon programmée pour faire référence au fournisseur de données
3 AssemblyQualifiedName System.Data.SqlClient.SqlClientFactory, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Nom qualifié complet de la classe de fabrique, contenant suffisamment d'informations pour instancier l'objet

Cette DataTable peuvent servir à autoriser un utilisateur à sélectionner un objet DataRow au moment de l'exécution. La DataRow sélectionnée puis peut être passée à la méthode GetFactory pour créer un objet DbProviderFactory fortement typé. Un objet DataRow sélectionné peut être passé à la méthode GetFactory pour créer l'objet DbProviderFactory souhaité.

Liste des classes de fabrique de fournisseurs installées

Cet exemple montre comment utiliser la méthode GetFactoryClasses pour retourner un objet DataTable contenant des informations sur les fournisseurs installés. Le code itère au sein de chaque ligne dans la DataTable, en affichant des informations pour chaque fournisseur installé dans la fenêtre de 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

Utilisation de fichiers de configuration d'application pour stocker des informations sur les fabriques

Le modèle de design permettant d’utiliser des fabriques implique de stocker des informations sur les fournisseurs et les chaînes de connexion dans un fichier de configuration d’application, tel que app.config pour une application Windows, et web.config pour une application ASP.NET.

Le fragment de fichier de configuration suivant montre comment enregistrer deux chaînes de connexion nommées : « NorthwindSQL » pour une connexion dans la base de données Northwind dans SQL Server, et « NorthwindAccess » pour une connexion dans la base de données Northwind dans Access/Jet. Le nom invariant est utilisé pour l’attribut 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>  

Récupération d'une chaîne de connexion à l'aide du nom du fournisseur

Pour créer une fabrique de fournisseurs, vous devez fournir une chaîne de connexion ainsi que le nom du fournisseur. Cet exemple montre comment extraire une chaîne de connexion d’un fichier de configuration d’application en passant le nom du fournisseur dans le format invariant « System.Data.ProviderName ». Le code itère au sein de l'objet ConnectionStringSettingsCollection. Il retourne la propriété ProviderName en cas de réussite; sinon null (Nothing dans Visual Basic). S'il existe plusieurs entrées pour un fournisseur, la première occurrence trouvée est retournée. Pour plus d’informations et des exemples d’extraction de chaînes de connexion à partir de fichiers de configuration, consultez Chaînes de connexion et fichiers de configuration.

Notes

Une référence à System.Configuration.dll est requise pour que le code s'exécute.

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

Création des objets DbProviderFactory et DbConnection

Cet exemple montre comment créer un DbProviderFactory et un objet DbConnection en lui passant le nom du fournisseur au format « System.Data.ProviderName » et une chaîne de connexion. Un objet DbConnection est retourné en cas de réussite ; null (Nothing dans Visual Basic) en cas d'erreur.

Le code obtient DbProviderFactory en appelant GetFactory. La méthode CreateConnection crée ensuite l'objet DbConnection et la propriété ConnectionString prend la valeur de la chaîne de connexion.

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

Voir aussi