Oracle
 sql >> Base de données >  >> RDS >> Oracle

Garder une base de données d'application agnostique (ADO.NET vs encapsulation de la logique de base de données)

Remarque : Cette réponse est pertinente si vous décidez d'utiliser les fonctionnalités de base d'ADO.NET 2 au lieu d'un ORM (comme Entity Framework ou NHibernate) ou LINQ to SQL.

Supposons que vous ayez une chaîne de connexion définie dans votre app.config :

<connectionStrings>
    <add name="SomeConnection"
         providerName="System.Data.SqlClient"
         connectionString="..." />
</connectionStrings>

Notez la présence du providerName attribut et sa valeur. Vous pouvez également saisir une valeur pour un autre fournisseur de base de données, par ex. System.Data.SQLite .

(Notez que les fournisseurs non standard, c'est-à-dire ceux qui ne sont pas dans le .NET Framework par défaut, doivent d'abord être enregistrés, soit dans app.config ou dans le machine.config de la machine cliente .)

Désormais, vous pouvez travailler avec la base de données spécifiée de manière totalement indépendante du fournisseur comme suit :

using System.Configuration;  // for ConfigurationManager
using System.Data;           // for all interface types
using System.Data.Common;    // for DbProviderFactories

var cs = ConfigurationManager.ConnectionStrings["SomeConnection"];
//                                              ^^^^^^^^^^^^^^^^

var factory = DbProviderFactories.GetFactory(cs.ProviderName);
//                                           ^^^^^^^^^^^^^^^

using (IDbConnection connection = factory.CreateConnection())
{
    connection.ConnectionString = cs.ConnectionString;
    //                            ^^^^^^^^^^^^^^^^^^^
    connection.Open();
    try
    {
        using (IDbCommand command = connection.CreateCommand())
        {
            ...  // do something with the database
        }
    }
    finally
    {
        connection.Close();
    }
}

Notez que ce code ne fonctionne qu'avec les types d'interface. Le seul endroit où vous indiquez un fournisseur de base de données particulier est via le providerName valeur d'attribut dans app.config dossier. (J'ai marqué tous les endroits où un paramètre de app.config est pris avec ^^^ s.)

Pour en savoir plus :

  • Codage générique avec les classes de base et les usines ADO.NET 2.0 :
    similaire à ma réponse, mais va plus en détail.

  • Fournisseurs gérés ADO.NET et DataSet Developer Center :
    comprend, entre autres, un index des fournisseurs de bases de données ADO.NET disponibles.