sql >> Databasteknik >  >> RDS >> Oracle

Att hålla en applikationsdatabas agnostisk (ADO.NET vs inkapslande DB-logik)

Obs! Det här svaret är relevant om du bestämmer dig för att använda grundläggande ADO.NET 2-funktionalitet istället för en ORM (som Entity Framework eller NHibernate) eller LINQ till SQL.

Låt oss anta att du har en anslutningssträng definierad i din app.config :

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

Lägg märke till förekomsten av providerName attribut och dess värde. Du kan också lägga in ett värde för en annan DB-leverantör, t.ex. System.Data.SQLite .

(Observera att icke-standardiserade leverantörer, det vill säga de som inte är i .NET Framework som standard, måste registreras först, antingen i app.config eller i klientdatorns machine.config .)

Nu kan du arbeta med den angivna databasen på ett helt leverantörs-agnostiskt sätt enligt följande:

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();
    }
}

Observera hur den här koden bara fungerar med gränssnittstyper. Den enda plats där du anger en viss DB-leverantör är genom providerName attributvärde i app.config fil. (Jag har markerat alla platser där en inställning från app.config tas med ^^^ s.)

Mer läsning:

  • Generisk kodning med ADO.NET 2.0 basklasser och fabriker:
    liknar mitt svar, men går in mer i detalj.

  • ADO.NET Managed Providers and DataSet Developer Center:
    innehåller bland annat ett index över tillgängliga ADO.NET-databasleverantörer.



  1. Vilken datatyp ska användas för att lagra telefonnummer i SQL Server 2005?

  2. MariaDB CURRENT_TIMESTAMP() Förklarad

  3. SQL GROUP BY-klausul för nybörjare

  4. En översikt över genererade kolumner för PostgreSQL