Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Eine Anwendungsdatenbank agnostisch halten (ADO.NET vs. Kapselung von DB-Logik)

Hinweis: Diese Antwort ist relevant, wenn Sie sich entscheiden, die grundlegende ADO.NET 2-Funktionalität anstelle eines ORM (wie Entity Framework oder NHibernate) oder LINQ to SQL zu verwenden.

Nehmen wir an, Sie haben eine Verbindungszeichenfolge in Ihrer app.config definiert :

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

Beachten Sie das Vorhandensein von providerName Attribut und seinen Wert. Sie können auch einen Wert für einen anderen DB-Anbieter eingeben, z. System.Data.SQLite .

(Beachten Sie, dass Nicht-Standardanbieter, d. h. solche, die standardmäßig nicht im .NET Framework enthalten sind, zuerst registriert werden müssen, entweder in app.config oder in der machine.config des Client-Rechners .)

Jetzt können Sie wie folgt vollständig anbieterunabhängig mit der angegebenen Datenbank arbeiten:

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

Beachten Sie, dass dieser Code nur mit Schnittstellentypen funktioniert. Der einzige Ort, an dem Sie einen bestimmten DB-Anbieter angeben, ist der providerName Attributwert in der app.config Datei. (Ich habe alle Stellen markiert, an denen eine Einstellung aus app.config wird mit ^^^ übernommen s.)

Weiterführende Literatur:

  • Generische Codierung mit den ADO.NET 2.0-Basisklassen und -Factories:
    ähnlich meiner Antwort, geht aber ins Detail.

  • ADO.NET Managed Providers and DataSet Developer Center:
    enthält unter anderem einen Index verfügbarer ADO.NET-Datenbankanbieter.