Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Was ist neu in ADO.NET

Geschrieben von: Christian Holm
Kategorie: ADO.NET

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.

Warum eine neue Technologie?

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:

  • Erstellen der Verbindung zur benötigten Datenbank
  • Gewinnung der erforderlichen Daten, z.B. über SQL-Statements
  • Ablegen der Datensätze im DataSet welches im Speicher residiert
  • Schließen der aktiven Verbindung zur Datenquelle
  • Manipulation der im DataSet enthalten Daten bei getrennter Verbindung

Vorteile von ADO.NET

  • Flexibilität: Die Flexibilität von ADO.NET ist auf die Verwendung von XML zurückzuführen. Dadurch, daß XML als Format für Datenaustausch zwischen den einzelnen Applikationen verwendet wird und XML schon eine große Akzeptanz genießt ist der Programmieraufwand relativ gering. Die Komponente die das Data Set als XML erhält muß zudem nicht unbedingt eine ADO.NET Komponente sein. Sie können die Komponente entweder mit Visual Studio.NET entwickeln oder auch mit jeder anderen IDE. Die einzige Vorausetzung für die Komponete ist, daß diese mit XML umgehen kann.

  • Einfache Wartung: Es gibt kaum eine Komponente die sich nicht laufend verbessert oder erweitert. Durch die Verwendung von XML gestaltet sich dies aber sehr einfach. Wenn Sie nun Funktionen erweitern bzw. hinzufügen wollen, brauchen Sie z.B. nur dem Data Set die Informationen für die hinzugefügte Tabelle oder Datenquelle bekannt geben.

  • Übersichtliche und typensichere Programmstruktur: Entwickler können die Objekte des ADO.NET einfachst durch die typensichere Programmstruktur verändern. Beispiel:

    in ADO:

    ...
    IF LieferDatum > rsProducts.Fields("Verfuegbarkeit").Value
    ...
    

    typensichere Programmstruktur in ADO.NET:

    ...
    IF LieferDatum > tProdukt.Verfuegbarkeit
    ...
    

  • Performance: Signifikante Unterschiede besonders gegenüber Disconnected Recordsets. In ADO.NET ist keine Datentypumwandlung in von COM akzeptierte Datentypen mehr nötig, um mit anderen Komponenten zu kommunizieren. Weiters enfällt durch Verwendung von XML das aufwendige COM Marshalling.

  • Skalierbarkeit: Durch die Verwendung von Data Sets werden lange Datenbank-Locks sowie lange aktive Datenbankverbindungen vermieden. Das spart Serverresourcen und stellt sicher, daß Ihre Applikation sowohl für 10 als auch 1000 User optimal arbeitet.

    Das MS .NET Framework und ADO.NET

    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.

    Das DataSet

    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:

    • Das SqlDataAdapter-Objekt: Wie der Name schon suggeriert, verwendet man es um mit SQL Server Datenbanken zu kommunizieren.
    • Das OleDbDataAdapter-Objekt: Mit diesem kann man auf alle Datenquellen zugreifen die von OLEDB Providern unterstützt werden.

    Als nächsten wichtigen Punkt folgt der DataTable, der die Struktur der Datenbank-Tabelle (Table) und die Daten an sich enthält.

    Der DataTable

    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;
    

    Die DataColumn

    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:

    .NET Data Providers

    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.

    Erstellung einer Verbindung

    Microsoft bietet Ihnen innerhalb des .NET Frameworks zwei Connection Objekte an:

    • Das SqlConnection Object - Zugriff auf MS SQL Server
    • Das OleDbConnection Object - Zugriff auf eine DB via OLEDB Provider

    Um einen .NET Data Provider des .NET Frameworks in Ihrem Sourcecode zu verwenden, müssen Sie wie gewohnt auf den dazugehörigen Namespace referenzieren:

    • SQL Server .NET Data Provider - System.Data.SqlClient
    • OleDb .NET Data Provider - System.Data.OleDb

    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
    }
    

    Schlußbemerkung

    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.

    Verwandte Artikel

    Das DataTable Objekt in ADO.NET
    Datenaufbereitung in ADO.NET
    Datenbankzugriff mittels ADO.NET
    Last but not least - .NET 1.0 ist da!
    Stored Procedures 101 in ADO.NET

    Wenn Sie jetzt Fragen haben...

    Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

    Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist.

    Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

     

    Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

    Bewerten Sie diesen Artikel
     Sehr gut   Nicht genügend  
       1  2  3  4  5  
     

      
       Für Ausdruck optimierte Seite

    ©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.