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, Db
DataReader sowie die bereits vorher vorhandene Db
DataAdapter-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 FLB
FluegeBackup";
// --- 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
Db
DataReader 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
Db
DataAdapter adapter = provider.Create
DataAdapter();
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);
}