Geschrieben von: Christian Holm
Kategorie: ADO.NET
This printed page brought to you by AlphaSierraPapa
Dieser Artikel gibt Ihnen einen Überblick über die wesentlichen Neuerungen in ADO.NET um einen raschen Umstieg zu ermöglichen. ADO.NET ist nicht "nur" eine neue Version von ADO (Microsoft ActiveX Data Objects), sondern bietet ernstzunehmende Vorteile in der Programmierung, Wartung, Performance und dem Datenaustausch zwischen einzelnen Komponenten, der auf dem universellen XML Standard basiert.
Wir werden uns mit dem grundsätzlichen Komponentenmodell auf dem ADO.NET aufbaut befassen, und die beiden wesentlichsten Grundbestandteile, das DataSet und die .NET Data Providers besprechen. Natürlich behandeln wir auch die Begriffe DataTable, DataReader und DataColumn damit Sie so schnell wie möglich effiziente Lösungen mit Hilfe von ADO.NET erstellen können.
ADO.NET enthält umfangreiche Verbesserungen von Microsoft ActiveX Data Objects (ADO), welches ein standardisiertes Entwicklungs-Modell für auf Datenaustausch basierende Applikationen bietet. Das Kernstück einer auf ADO.NET aufbauenden Applikation ist das Data Set. Das Data Set ist eine im Speicher abgelegte Kopie eines Datenbankinhaltes, einer oder mehrerer Datenbanken. Ein Data Set kann mehrere Datentabellen enthalten, welche sich auf die einzelnen Tabellen in der Datenbank oder auf spezielle Views beziehen. Während dem Arbeiten mit einem Data Set besteht aber keine aktive Verbindung mit der physikalischen Datenquelle, weil ja das Data Set im Speicher abgelegt wird.
Das folgende vereinfachte Schema zeigt die Hauptstruktur von ADO.NET:
Anders als in früheren Versionen von ADO, werden folgende Schritte durchgeführt um den Datenaustausch bzw. die Manipulation von Daten durchzuführen:
in ADO:
... IF LieferDatum > rsProducts.Fields("Verfuegbarkeit").Value ...
typensichere Programmstruktur in ADO.NET:
... IF LieferDatum > tProdukt.Verfuegbarkeit ...
Wie Sie vielleicht schon wissen oder in unseren bereits erschienenen Artikeln gelesen haben, ist das .NET Framework objektorientiert. Wenn Sie nun einen speziellen Teil aus dem Framework bzw. eben ADO.NET verwenden wollen, müssen Sie den gewünschten Namespace referenzieren. Sie müssen sowohl angeben daß Sie mit ADO.NET arbeiten wollen, als auch den gewünschten Provider auswählen:
C#:
//Referenz auf Data Namespace: using System.Data;
//Auswahl des OleDb Providers using System.Data.OleDb;
oder
//Auswahl des SQL Providers using System.Data.SqlClient;
VB.NET:
Imports System.Data Imports System.Data.OleDb
oder
Imports System.Data.SqlClient
Beginnen wir nun mit einem kurzen Überblick über das DataSet-Objekt und seine Bestandteile.
Ein Data Set ist im XML Format gespeichert, was natürlich den Datenaustausch unter verschiedenen Anwendungen erheblich erleichtert. DataSets können auch Daten enthalten die mit Beziehungen verknüpft sind, wie z.B. Parent-Child-Beziehungen die in einer hierarchischen Anordnung gespeichert sind. Das DataSet ist also ein universell einsetzbares Modell welches unabhängig von der zugrundeliegenden Datenquelle ist, und Tabellen, Datenspalten bzw. -reihen, Constraints und Beziehungen enthält.
Die hierarchische Struktur des Data Set Modells sieht so aus:
Um einen reibungslosen Austausch der Daten zwischen Data Sets und den zugeordneten Datenquellen zu ermöglichen, verwendet ADO.NET ein Objekt namens DataSetCommand. Microsoft bietet hierfür zwei Möglichkeiten je nach Datenquelle an:
Als nächsten wichtigen Punkt folgt der DataTable, der die Struktur der Datenbank-Tabelle (Table) und die Daten an sich enthält.
Ein DataTable stellt eine Tabelle (Table) der im Speicher abgelegten Daten dar. Wie schon erwähnt enthält dieser die Struktur der Tabelle, welche durch die Aufteilung in Spalten (ColumnsCollection) gegeben ist. Hinzu kommen noch die einzelnen Datenreihen (RowsCollection), welche die in der Tabelle gespeicherten Daten repräsentieren. Der DataTable speichert sowohl den originalen State der Daten als auch die Veränderungen.
Erstellen wir nun unter Verwendung von C# als Beispiel eine neue Instanz eines DataTables namens Verkauf mit einem Table mit der Bezeichnung tProdukte. Als sinnvolle Eigenschaft sollen die Stringvergleiche im DataTable case sensitiv sein:
Instanzieren des DataTables:
DataTable Verkauf = new DataTable(); Verkauf.CaseSensitive = true;
Erstellen des tProdukte Tables:
Verkauf.TableName = "tProdukte";
Alternativ bietet sich natürlich der um einiges kürzerer Code an:
DataTable Verkauf = new DataTable("tProdukte"); Verkauf.CaseSensitive = true;
Natürlich wollen Sie dem Table auch Spalten hinzufügen. Hierbei gibt es zwei Möglichkeiten. Die eine ist die Erstellung von normalen Spaltenfeldern, worin wie gewohnt Daten gespeichert werden. Die andere Möglichkeit besteht darin, Berechnungsfelder mit enthaltenen Berechnungsformel zu erstellen.
Befassen wir uns zunächst mit der ersten Möglichkeit. Erstellen wir eine Spalte namens ProduktName in unserem zuvor erstellten DataTable Verkauf. Diese Spalte soll vom Datentyp String sein, da darin wie der Name suggeriert die tatsächlichen Namen der Produkte gespeichert werden.
Wir deklarieren zunächst eine Variable namens VerkaufSpalte vom Datentyp DataColumn. Diese erhält am Anfang den Wert null, da es am Beginn noch keine Spalten gibt.
DataColumn VerkaufSpalte = null;
Nun erstellen wir die neue Spalte ProduktName samt String Datentyp-Zuweisung, nachdem wir wie oben gezeigt den DataTable instanziert haben.
VerkaufSpalte = tProdukte.Columns.Add("ProduktName", System.Type.GetType("System.String"));
Da wir für Endkunden die Mehrwertsteuer zum Nettopreis hinzurechen wollen, können wir dies elegant mit einem Berechnungsfeld lösen:
DataColumn Bruttopreis = new DataColumn(); Bruttopreis.DataType = System.Type.GetType("System.Currency"); Bruttopreis.Expression = "Nettopreis * 1.2";
Sie wissen nun wie man DataTables, Tables und Colums erstellt. Welche Möglichkeiten des Zugriffs es auf eine bestehende Datenbank gibt, beschreibt der zweite Kernpunkt dieses Artikels:
Unter diesem Punkt möchte ich beschreiben, wie man eine Verbindung allgemein aufbaut, eine einfache Abfrage erstellt und was es mit dem DataReader so auf sich hat.
Microsoft bietet Ihnen innerhalb des .NET Frameworks zwei Connection Objekte an:
Um einen .NET Data Provider des .NET Frameworks in Ihrem Sourcecode zu verwenden, müssen Sie wie gewohnt auf den dazugehörigen Namespace referenzieren:
In dem nun folgenden Beispiel erstellen und öffen wir eine Verbindung zu einer SQL Datenbank unter Verwendung von C#. Einmal verwenden wir das OleDbConnection Object und dann das optimalere SqlConnection Object:
OleDbConnection Object:
string strConn ="Provider= SQLOLEDB.1; Data Source=localhost; uid=sa; pwd=;" _ " Initial Catalog=MyDatabase;"; OleDbConnection MyDBConn = new OleDbConnection(strConn); MyDBConn.Open(); ...
SqlConnection Object:
string strConn ="server=localhost; uid=sa; pwd=; database=MyDatabase;"; SqlConnection MyDBConn = new SqlConnection(strConn); MyDBConn.Open(); ...
Nachdem wir also die Verbindung zur Datenbank geöffnet haben wollen wir nun ein einfaches SQL Statment ausführen.
OledbCommand:
string strSQL = "SELECT * FROM tProdukte"; OleDbDataAdapter MyCmd = new OleDbDataAdapter(strSQL, MyDBConn);
SQLCommand:
string strSQL = "SELECT * FROM tProdukte"; SqlDataAdapter MySqlCmd = new SqlDataAdapter(strSQL, MyDBConn);
Bevor wir wir nun den Befehl ausführen können, müssen wir noch das DataReader Objekt erstellen.
OldbDataReader:
OlDbDataReader MySqlReader = MySqlCmd.ExecuteReader();
SqlDataReader:
SqlDataReader MySqlReader = MySqlCmd.ExecuteReader();
DataReader schön und gut, aber warum sollte man diesen verwenden, wenn man ja das DataSet auch verwenden könnte? Nun bei sehr großen Datenbanken und großer Benutzeranzahl werden Serverresourcen schnell aufgebraucht. Wenn diese User nun zusätzlich von der Datenbank 10000 Datenreihen einlesen, muß Speicher für diese allokiert werden und bis zum Schluß verfügbar sein. Und das Data Set cacht diese Daten.
Bei einfachen Ausleseoperationen verwenden Sie den resourcenschonenden DataReader. Dieser ist ein forward- und read-only Cursor, der immer nur eine Zeile abarbeitet:
while (MySqlReader.Read()) { // Statements }
Dieser Artikel stellt eine Einführung in ADO.NET dar, mit dem Focus auf Umsteiger, die schon Erfahrung mit ADO haben - damit ein schnellerer Umstieg auf ADO.NET möglich wird.
Sie haben das neue ADO.NET Objektmodell und seinen Aufbau bzw. Struktur kennengelernt. Sie wissen in groben Zügen die Vorteile dieser neuen interessanten Technologie, und kennen die Begriffe DataSet, DataTable sowie DataColumn. Das Erstellen einer Datenbank-Verbindung, eines einfachen Abfrage-Statements und das effiziente Auslesen der einzelnen Datenreihen mit Hilfe des DataReaders haben ich Ihnen ebenfalls kurz gezeigt.
In zukünftigen Artikeln über ADO.NET werde ich mich ausführlicher mit dem Datenbankzugriff befassen.
This printed page brought to you by AlphaSierraPapa
Das DataTable Objekt in ADO.NET
http:/www.aspheute.com/artikel/20001116.htm
Datenaufbereitung in ADO.NET
http:/www.aspheute.com/artikel/20001106.htm
Datenbankzugriff mittels ADO.NET
http:/www.aspheute.com/artikel/20001102.htm
Last but not least - .NET 1.0 ist da!
http:/www.aspheute.com/artikel/20020117.htm
Stored Procedures 101 in ADO.NET
http:/www.aspheute.com/artikel/20010626.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.