Langue

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 GetFactory méthode retourne une fabrique de fournisseur fortement typée. Par exemple, après vous être inscrit SqlClientFactory, passez GetFactory le nom du fournisseurMicrosoft.Data.SqlClient. Une autre surcharge de GetFactory prend un DataRow. Une fois que vous avez obtenu 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.

Remarque

Les classes OracleClientFactory, OdbcFactory et OleDbFactory fournissent également des fonctionnalités similaires.

Enregistrement de DbProviderFactories

Installez le package NuGet Microsoft.Data.SqlClient avant d’enregistrer sa fabrique.

Sur .NET Framework, ajoutez la section suivante system.data à l’intérieur de l’élément configuration du fichier web.config ou app.config de votre application. L’élément remove évite les enregistrements en double hérités d’un autre fichier de configuration.

<system.data>
  <DbProviderFactories>
    <remove invariant="Microsoft.Data.SqlClient" />
    <add name="Microsoft SqlClient Data Provider"
     invariant="Microsoft.Data.SqlClient"
     description="Microsoft SqlClient Data Provider for SQL Server"
     type="Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient"
    />
  </DbProviderFactories>
</system.data>

Sur les .NET modernes, les fichiers de configuration n’enregistrent pas les fabriques de fournisseurs de données. Avant d’appeler GetFactory, appelez RegisterFactory(String, DbProviderFactory) avec Microsoft.Data.SqlClient comme nom du fournisseur et Instance comme instance de fabrique. RegisterFactoryn'est pas disponible sur .NET Framework.

Les exemples suivants enregistrent la fabrique dans le code pour les .NET modernes. Pour .NET Framework, utilisez l’entrée de configuration précédente et omettez tout RegisterFactory appel.

Le nom invariant du fournisseur identifie le fournisseur de données sous-jacent. Utilisez le même nom pour les recherches de fabrique et l’attribut providerName d’une chaîne de connexion.

Récupération des informations relatives aux fournisseurs

Vous pouvez récupérer des informations sur les fournisseurs de données inscrits en utilisant la méthode GetFactoryClasses. Il retourne un DataTable nommé DbProviderFactories qui contient les colonnes décrites dans le tableau suivant. Les exemples de valeurs correspondent à l’entrée de configuration .NET Framework affichée précédemment ; les détails de la version de l’assembly dépendent du package installé.

Numéro de colonne Nom de la colonne Exemple de sortie Descriptif
0 Name Microsoft Fournisseur de données SqlClient Nom lisible pour le fournisseur de données
1 Description Microsoft SqlClient Fournisseur de données for SQL Server Description lisible pour le fournisseur de données
2 InvariantName Microsoft.Data.SqlClient Nom qui peut être utilisé de façon programmée pour faire référence au fournisseur de données
3 AssemblyQualifiedName Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient Nom qualifié d’assembly de la classe de fabrique

Vous pouvez utiliser ce DataTable pour permettre à un utilisateur de sélectionner un 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 parcourt chaque ligne dans la DataTable, affichant des informations pour chaque fournisseur installé dans la fenêtre de la console.

    // This example assumes a reference to System.Data.Common.
    static DataTable GetProviderFactoryClasses()
    {
#if !NETFRAMEWORK
        DbProviderFactories.RegisterFactory("Microsoft.Data.SqlClient", SqlClientFactory.Instance);
#endif

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

#If Not NETFRAMEWORK Then
        DbProviderFactories.RegisterFactory("Microsoft.Data.SqlClient", SqlClientFactory.Instance)
#End If

        ' 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 conception utilisé pour travailler avec des fabriques consiste à stocker les informations de fournisseur et de chaîne 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 invariant nom est utilisé pour l’attribut providerName .

<configuration>
  <connectionStrings>
    <clear/>
    <add name="NorthwindSQL"
     providerName="Microsoft.Data.SqlClient"
     connectionString=
     "Data Source=&lt;server&gt;;Initial Catalog=Northwind;Integrated Security=true;Encrypt=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 vous recommande d’utiliser le flux d’authentification le plus sécurisé disponible. Si vous vous connectez à Azure SQL, les identités managées pour les ressources Azure sont la méthode d'authentification recommandée.

Récupération d'une chaîne de connexion via nom de fournisseur

Pour créer une connexion via un fournisseur de fabrique, vous devez fournir une chaîne de connexion ainsi que le nom du fournisseur. Cet exemple montre comment récupérer un chaîne de connexion à partir d’un fichier de configuration d’application en passant le nom du fournisseur invariant, tel que Microsoft.Data.SqlClient. Le code itère au sein de l'objet ConnectionStringSettingsCollection. Elle retourne la chaîne de connexion correspondante 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.

Remarque

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 de DbProviderFactory et DbConnection

Cet exemple montre comment créer un objet DbProviderFactory et un objet DbConnection en lui transmettant le nom du fournisseur invariant, tel que Microsoft.Data.SqlClient, 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
            {
#if !NETFRAMEWORK
                if (providerName == "Microsoft.Data.SqlClient")
                {
                    DbProviderFactories.RegisterFactory(providerName, SqlClientFactory.Instance);
                }
#endif

                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
#If Not NETFRAMEWORK Then
                DbProviderFactories.RegisterFactory("Microsoft.Data.SqlClient", SqlClientFactory.Instance)
#End If
                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