29 Nov
2005

Datenbankabstraktion mit .NET 2.0

 

Möchte man seine Anwendung Datenbank unabhängig gestalten so musste man in .NET 1.1 s.g. Data Access Layer implementieren. Diese beinhalten dann den Datenzugriff. Dies ist mit einem gewissen Aufwand verbunden.

In .NET 2.0 basieren nun alle Datenbank-Klassen auf den Basis-Klassen aus System.Data.DbCommon, das ist nicht nur nettes Design sondern man kann mit diesen Basis-Klassen auch arbeiten. Dazu muss man einfach über DbProviderFactory nur Datenbankspezifische Objekte erzeugen. Leider ist SQL nicht Datenbankunabhängig, also müssen die SQL Statements pro Datenbank erzeugt werden. Dies jedoch im Quelltext zu halten ist suboptimal. Besser ist es wenn alle Selects, Inserts, Updates usw. in Stored Procedures ablaufen die mit Parametern bestückt werden. So ist das Datenbankspezifische SQL da wo es hingehört ... in der Datenbank. Dies impliziert das es am besten mit Datenbanken funktioniert die Stored Procedures unterstützen. Access, MySQL 3 und 4 fallen somit aus dem Raster. Die Steuerung welche Datenbank verwendet wird kann über die Konfiguration in der web.config geschehen. Dort gibt man den neben dem eigentlichen ConnectionString auch den Namen des Datenbank-Providers an.

<connectionstrings>
   <add providername="System.Data.SqlClient" 
        connectionstring="Data Source=DBSERVER;Initial Catalog=foobar;User ID=foo;Password=bar"
        name="foobar" />
</connectionstrings>

Mit diesen Angaben kann eine entsprechende Connection erzeugt werden.

ConnectionStringSettings css = ConfigurationManager.ConnectionStrings["foobar"]; 
DbProviderFactory factory = DbProviderFactories.GetFactory(css.ProviderName); 
DbConnection conn = factory.CreateConnection(); 
conn.ConnectionString = css.ConnectionString; 
conn.Open(); 

Ist diese nun vorhanden und geöffnet kann ein DbCommand erzeugt werden um die Stored Procedure abzusetzen.

DbCommand cmd = conn.CreateCommand(); 
cmd.CommandText = "DELETE_FOO_BAR"; 
cmd.CommandType = CommandType.StoredProcedure;

Zu fast jeder Stored Procedure gehören Parameter

DbParameter par = factory.CreateParameter();
par.ParameterName = "name";
par.Value = "joe";
cmd.Parameters.Add(par); 

Nun noch wie üblich ausführen und fertig.

cmd.ExecuteNonQuery(); 
conn.Close();

Sicherlich ist dies auf den ersten Blick ein wenig Mehraufwand beim Tippen. Da es einige Methoden, z.B. bei hinzufügen von Parameter, nicht gibt da die Schnittstelle etwas allgemeiner gehalten ist. Dies ist aber mit einer kleinen Hilfsklasse behebbar, so das die Anwendung von DbCommand nicht schwieriger ist wie SqlCommand oder OleDbCommand. So könnte es aussehen

using (Database db = Database.Instance) 
{ 
  using (DbCommand cmd = db.CreateStoredProcedure("DELETE_FOO_BAR")) 
  {
     db.AddParameter(cmd, "name", "joe"); 
     cmd.ExecuteNonQuery(); 
  }
} 

Ist doch sicherlich schon übersichtlicher wie das oben gezeigte.

Technorati-Tags:

Der Eintrag ist mir etwas Wert
 
Comments have been closed on this topic.