Providerfabrik

Eintrag zuletzt aktualisiert am: 10.02.2007

Stark vereinfacht wurde in ADO.NET 2.0 die Möglichkeit, unabhängig von einer konkreten Datenbank zu programmieren. Durch die neuen Basisklassen DbProviderFactory, DbConnection, DbCom-mand, DbDataReader sowie die bereits vorher vorhandene DbDataAdapter-Klasse kann man nun die Informationen zum Datenprovider in einer zur Laufzeit austauschbaren Zeichenkette halten. Die Klassen befinden sich im Namensraum System.Data.Common.

Durch die neue Funktion zur Ermittlung der installierten ADO.NET-Datenprovider (siehe Anfang dieses Kapitels) wird es möglich, dass eine Anwendung zur Laufzeit aus den verfügbaren Da-tenprovidern einen geeigneten Provider auswählt.

Es findet aber keine Übersetzung von SQL-Befehlen statt. Wenn Sie datenbankmanagementsystem-spezifische Befehle nutzen, verlieren Sie die Providerunabhängigkeit.

Beispiel

Das folgende Beispiel zeigt das Lesen von Daten mit einem Datareader und einem Dataset mithilfe des providerunabhängigen Programmiermodells. Dabei wird bei der Instanziierung der Klasse DbProvi-derFactory der Datenprovider (hier: System.Data.SqlClient) festgelegt. Durch die Instanz der Klasse DbProviderFactory können dann spezifische Verbindungsobjekte (provider.Create¬Connection()), Befehlsobjekte (provider.CreateCommand()) und Datenadapter (provi-der.CreateDataAdap¬ter()) erzeugt werden.

public static void run()
{
Demo.Print("=== DEMO Provider Factory");
const string PROVIDER = "System.Data.SqlClient";
const string CONNSTRING = "Integrated Security=SSPI;Persist Security In-fo=False;Initial Catalog=itvisions; Data Source=Wetter\SQLEXPRESS";
const string SQL1 = "Select * from FL_Fluege";
const string SQL2 = "Select * from FLBFluegeBackup";
// --- Fabrik erzeugen
DbProviderFactory provider = DbProviderFactories.GetFactory(PROVIDER);
// --- Verbindung aufbauen
DbConnection conn = provider.CreateConnection();
conn.ConnectionString = CONNSTRING;
conn.Open();
// --- Teil 1: DataReader
// Befehl erzeugen
DbCommand cmd = provider.CreateCommand();
cmd.CommandText = SQL1;
cmd.Connection = conn;
// Befehl ausführen
DbDataReader reader = cmd.ExecuteReader();
// Daten ausgeben
Demo.PrintReader(reader);
// --- Teil 2: DataSet
// Befehl erzeugen
DbCommand command = provider.CreateCommand();
command.CommandText = SQL2;
command.Connection = conn;
// DataAdapter erzeugen
DbDataAdapter adapter = provider.CreateDataAdapter();
adapter.SelectCommand = command;
// DataSet erzeugen
DataSet ds = new DataSet();
// DataSet befüllen
adapter.Fill(ds);
// Daten ausgeben
DataTable t = ds.Tables[0];
Demo.Print("Anzahl Spalten: " + t.Columns.Count);
Demo.Print("Anzahl Zeilen: " + t.Rows.Count);
}