sql >> Database teknologi >  >> RDS >> Oracle

Holde en applikationsdatabase agnostisk (ADO.NET vs indkapsling af DB-logik)

Bemærk: Dette svar er relevant, hvis du beslutter dig for at bruge grundlæggende ADO.NET 2-funktionalitet i stedet for en ORM (såsom Entity Framework eller NHibernate) eller LINQ til SQL.

Lad os antage, at du har en forbindelsesstreng defineret i din app.config :

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

Bemærk tilstedeværelsen af ​​providerName egenskab og dens værdi. Du kan også indsætte en værdi for en anden DB-udbyder, f.eks. System.Data.SQLite .

(Bemærk, at ikke-standardudbydere, dvs. dem, der ikke er i .NET Framework som standard, skal registreres først, enten i app.config eller i klientmaskinens machine.config .)

Nu kan du arbejde med den angivne database på en fuldstændig udbyderagnostisk måde som følger:

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

Bemærk, hvordan denne kode kun virker med grænsefladetyper. Det eneste sted, hvor du angiver en bestemt DB-udbyder, er gennem providerName attributværdi i app.config fil. (Jeg har markeret alle de steder, hvor en indstilling fra app.config er taget med ^^^ s.)

Yderligere læsning:

  • Generisk kodning med ADO.NET 2.0 basisklasser og fabrikker:
    ligner mit svar, men går mere i detaljer.

  • ADO.NET Managed Providers and DataSet Developer Center:
    inkluderer blandt andet et indeks over tilgængelige ADO.NET-databaseudbydere.



  1. Hvorfor intet output, når PLSQL Anonymous-blok er fuldført?

  2. Hvordan skriver man parametriseret orakelindsæt-forespørgsel?

  3. CAST() Funktion i Oracle

  4. Forbinder Oracle til PostgreSQL