Der-Albert.com sein Blog!


November 2005 Entries

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:

Von WordPress zu Serendipity

Der Blog ist kaum ein paar Tage alt und schon gibt es einen Softwarewechsel. Beim Übersetzen der verwendeten WordPress-Theme bin sehr gefrustet über die Architektur und Aufbau der Themes. Eine Trennung zwischen Darstellung und Code gab es nicht wirklich. Dann die gleichen Texte immer wieder an den verschiedensten Stellen zu suchen, übersetzen, im PHP Quelltext rumfummeln, keine Einheitliche Ausgabe der Texte haben mich doch schnell dazu bewogen die Blog-Software zu wechseln. Deshalb bin ich nun bei Serendipity gelandet, ist zwar auch PHP ;) aber der Aufbau von Code, Templates und separaten Sprachdateien gefällt mir doch um einiges besser. Übersetzt ist auch schon alles. Leider ist bei der Umstellung durch eine Unachtsamkeit meinerseits die Inhalte des alten Blog zerstört worden (waren nur 3 Einträge mit einem Kommentar). Zwei Einträge habe ich neu erstellt und der dritte brachte nur meinen Unmut über WordPress zum Ausdruck.

Hallo Welt!

Willkommen bei bei Der-Albert.com, meinem kleinen Blog. Mal sehen was die Zukunft hier bringt. Großteils wird es hier um Entwicklung von Programmen für’s Intranet, Internet und Windows gehen. Auf Grund meiner aktuellen Tätigkeit wird der Schwerpunkt wohl bei ASP.NET 2.0 und C# liegen. Muss doch mal der Welt mitteilen was ich die letzten Monate so geschafft habe :) Auch wird hier die eine oder andere Software, Libraries oder Code-Snippet veröffentlich werden. Aktuell findet sich hier der UO Launcher, ein Tool welches ich vor langer Zeit mal für ein paar Ultima Online süchtige Freunde geschrieben habe. Na denn, ich denke das mein Blog ein Informatives sein wird. Achso, das Design wird in den nächsten Tagen natürlich angepasst und auf ein eigenes umgestellt werden.