Geschrieben von: Christian Holm
Kategorie: ADO.NET
This printed page brought to you by AlphaSierraPapa
In diesem Artikel lernen Sie wie man in ADO.NET Daten einer Datenbank für den Client strukturiert und optisch ansprechend darstellt. Sie werden zwei Möglichkeiten kennen lernen - nämlich den OleDbDataReader sowie die Verwendung von DataBind und die Visualisierung der Daten mit der DataGrid Web Control. Mit diesen zwei Möglichkeiten können Sie die zurückgegebenen Daten aus einer Datenbank einfachst mit ADO.NET aufbereitet im Webbrowser darstellen. Anhand von Beispielen werden wir den Syntax besprechen und die Vor- und Nachteile in der Anwendung dieser kennenlernen.
Beachten Sie, daß dieser Artikel auf einigen Artikeln aufbaut. Damit Sie so schnell wie möglich zum gewünschten Erfolg kommen, habe ich den Sourcecode der Beispiele in jedem dieser Artikel Schritt für Schritt erweitert. Daher ist es ratsam, falls Sie neu auf dem Gebiet sind, die folgenden Artikel vorher durchzustudieren:
Da der Sourcecode der Beispiele in C# geschrieben ist, sollten Sie grundlegende Kenntnisse über diese Programmiersprache haben - es finden sich dazu natürlich etliche Artikel bei AspHeute, die Ihnen das notwendige Wissen vermitteln.
Wenn Sie den Beispiel-Sourcecode (im Download 20001106.zip) selbst ausprobieren möchten, so benötigen Sie die Datenbanksoftware Microsoft SQL Server 7.0 (oder höher). Die Beispiele verwenden die folgende Zugangsberechtigung (Username / Password): uid=sa; pwd=;. Als Beispieldatenbank habe ich die Northwind Datenbank herangezogen. Diese ist standardmäßig in den Beispieldatenbanken des SQL Servers enthalten. Wenn die SQL Server Datenbank nicht auf dem lokalen Computer (dem Webserver) installiert ist, so müssen Sie zusätzlich den Data Source Parameter im Connection-String auf den Namen (oder die IP Adresse) des Datenbankservers ändern.
Weiters ist zu beachten, daß wie immer bei unseren ASP.NET Artikeln, Sie nur dann vom downloadbaren Sourcecode profitieren können, wenn Sie das Microsoft .NET Framework SDK auf einem Webserver installiert haben. Damit werden auf diesem Webserver ASP.NET Seiten ( .aspx ) ausführbar.
Die OleDbDataReader Klasse bietet Ihnen eine einfache und resourcenschonende Möglichkeit um Daten am Webbrowser darzustellen. Der OleDbDataReader liefert Ihnen einen read-only, forward-only Stream der instanzierten Verbindung einer Datenquelle. Der OleDbDataReader wird durch die Execute Methode des OleDbCommand Objektes ausgeführt. Im Gegensatz zur Verwendung des DataTables der auf den gesamten Inhalt des Streams zugreift und dieser im Speicher ablegt ist, iteriert der DataReader stattdessen durch jede einzelne Datenreihe.
Somit liegt der Hauptvorteil seiner Verwendung in der Geschwindigkeit der Ausgabe und der geringere Webserver Resourcenaufwand. Dies kann bei den ohnehin schon limitierten Webserver Resourcen bei z.B. einigen 1000 Datenreihen zum Vorteil werden.
Der DataReader findet also durch seine Eigenschaften (read-only, forward-only Stream) dort Anwendung wo Sie nur Daten am Browser ausgeben wollen und nicht nächträglich bearbeiten wollen bzw. müssen. Zusätzlich ist noch folgendes zu beachten:
Wie nun die richtige Reihenfolge aussieht, möchte ich Ihnen im folgenden minimal Beispiel demonstrieren. Sie finden es im Dowload unter der Bezeichnung SQLDataReader.aspx:
// Namespace Referenzen <script language=C# runat="server"> void Page_Load(Object Src, EventArgs E) { // Deklaration des Connection Strings // Deklaration des SQL-Statement Strings SqlConnection MyNWConn = new SqlConnection(strConn); SqlCommand MySqlCmd = new SqlCommand(strSQL, MyNWConn); MyNWConn.Open(); SqlDataReader MySqlReader = MySqlCmd.ExecuteReader(); while (MySqlReader.Read()) { Response.Write(MySqlReader["Productname"].ToString()); } MySqlReader.Close(); MyNWConn.Close(); } </script>
Wie immer muß zuerst auf die benötigten Namespaces referenziert werden. Mit der Page_Load Methode weisen wir die Runtime daraufhin, diesen Codeblock beim Seitenaufruf ablaufenzulassen. Wir deklarieren danach den Connection String sowie den SQL-Statement String damit der DataReader auch was zutun hat. Nachdem nun alle Voraussetzungen getroffen sind, können wir nun "Kontakt" zur Datenbank aufnehmen.
Bis hierher nichts Neues. Jetzt wirds aber spanned! Bevor wir die Execute Methode aufrufen können, brauchen wir für diese Methode ein Objekt als Parameter. Dieses Objekt ist natürlich der DataReader und geben ihm einen "sinnvollen" Namen. MySqlReader ist zwar nicht sonderlich aufregend, hat aber Wiedererkennungswert bei späteren möglichen Problemen. Wenn also etwas schiefgehen sollte, und die Compilermeldung enthält diesen Namen, dann weiß man oft was los ist.
Da wir nun das SqlDataReader Objekt mit dem Namen MySqlReader erstellt haben, können wir sofort die Execute Methode anwenden. Da der DataReader jedoch nur eine Reihe auf einmal ausgibt, müssen wir uns mit dem simplen while Statement abhelfen. Solange der DataReader Datensätze einlesen kann arbeitet er (siehe Condition im while-Statement) und hört auf wenn es nichts mehr zu tun gibt.
Das ist sehr praktisch, und wir brauchen somit am Ende des Auslesens nur die nicht mehr benötigten Resourcen wieder freigeben. Das Ergebnis des oben besprochenen Codes sieht dann im Browser folgendermaßen aus:
Sobald Sie diesen Screenshot sehen, fragen Sie sich sicher "Was ist daran übersichtlich - alles in einer Wurscht!" Zurecht! Man bedenke, daß ich hier nur eine Datenspalte ausgegeben habe und durch ein spezifisches SQL-Statement das Resultat schon eingeschränkt habe. Ich glaube, daß die Northwind Datenbank groß genug ist, um mit einem SELECT * das gesamte Browserfenster zukleistern zu können.
Daher werden wir natürlich den Sourcecode verbessern müssen.
Nichts leichter als das! Diesmal geben wir alle Datenspalten des SQL-Staments aus und formatieren die gewonnen Daten mithilfe eines ganz gewöhnlichen HTML Tables. Trivial, aber einfach und brauchbar.
Diese Verbesserung des vorigen Sourcecodes sehen Sie nun folgend, und Sie finden den gesamten im Download in der Datei SqlDataReader_WellFormed.aspx (die Unterstriche/Underscores bei manchen Sourcecodezeilen dienen lediglich als Zeilenumbruch um diese Seite passend darzustellen zu können!):
... Response.Write("<table cellspacing=\"2\" cellpadding=\"2\" border=\"2\">"); Response.Write("<tr><th>Produktname</th><th>Firma</th><th> _ Stückpreis (USD)</th></tr>"); while (MySqlReader.Read()) { Response.Write("<tr>"); Response.Write("<td>" + MySqlReader["Productname"].ToString() + "</td>"); Response.Write("<td>" + MySqlReader["CompanyName"].ToString() + "</td>"); Response.Write("<td align=\"center\">" + MySqlReader["UnitPrice"].ToString() _ + "</td>"); Response.Write("</tr>"); } Response.Write("</table>"); ...
Wie Sie nun feststellen wirklich nichts aufregendes aber wirkungsvoll (siehe nächsten Screenshot)!
Beachten Sie bitte, daß Sie natürlich die doppelten Anführungszeichen der HTML Tags mit \" maskieren müssen, denn Response.Write und der Rest des Codes reagieren etwas bockig, wenn Sie dies unterlassen.
Es gibt in gewissen Situationen immer Möglichkeiten wie man es besser, schneller und einfacher machen kann. So auch hier. Wenn Sie zum Beispiel sehr viele Datenspalten anzeigen wollen, schafft man sich mit dem folgenden Codebeispiel Abhilfe (SQLDataReader_WellFormedNEU.aspx):
Response.Write("<table cellspacing=\"2\" cellpadding=\"2\" border=\"2\">"); Response.Write("<tr><th>Produktname</th><th>Firma</th> _ <th>Stückpreis (USD)</th></tr>"); while (MySqlReader.Read()) { Response.Write("<tr>"); for (int i=0; i < 3; i++) { Response.Write("<td>" + MySqlReader.GetValue(i) + "</td>"); } Response.Write("</tr>"); } Response.Write("</table>");
Zugegeben eine brutale Methode, aber bei vielen Datenspalten spart man sich einige Schreib- bzw. Kopier- und Ausbesserungsarbeit. Einfach im for-Statement die richtige Anzahl der Datenspalten angeben (sonst hagelts Exceptions) und man hat mit diesen zwei einfachen Codezeilen ganze Arbeit geleistet.
Da aber so wie hier eine Datenbank selten immer den gleichen Datentyp in den einzelen Datenspalten verwendet, mache ich Gebrauch von der GetValue Methode um Casting Exceptions sicher aus dem Wege zu gehen. Die "overloaded" GetValue Methode sorgt dafür, daß alle gewünschten Daten, egal welchen Datentyps, zurückgegeben werden. Brutal, aber da der Stream sowieso forward-only und read-only ist, ist diese Methode verzeihbar.
Natürlich unterstützt der DataReader auch andere Get Methoden, wie GetString, GetDataTime, GetDouble, GetInt32, etc.
Was aber, wenn die obigen Voraussetzungen für den DataReader nicht zutreffen; z.B. Sie möchten die Daten aus der Datenbank später noch Manipulieren. Dafür gibt es folgende Möglichkeit:
DataBind verwenden Sie in Zusammenhang mit einem zuvor befüllten DataSet (siehe Datenbankzugriff mittels ADO.NET). Das disconnected DataSet beinhaltet eine im Speicher abgelegte Kopie eines Datenbankinhaltes einer oder mehrerer Datenbanken. Daher müssen Sie auch zuerst das DataSet Objekt instanzieren um es danach mit der Fill Methode des OleDbDataAdapter Objektes befüllen zu können.
Mit DataBind können Sie einer DataGrid Web Control Daten zuweisen. Die DataGrid Web Control ist für die Aufbereitung der Daten zuständig, und enthält ein umfangreiche Formatoptionen.
Das nächste Sourcecodebeispiel zeigt die Befüllung eines DataSets, sowie die Verwendung von DataBind und DataGrid (DataBindnGrid.aspx):
// Namspace Referenzen, Deklarationen, etc. ... DataSet MyDataSet = new DataSet(); SqlDataAdapter oCommand = new SqlDataAdapter(strSQL,MyNWConn); oCommand.Fill(MyDataSet,"Lieferanten"); MyNWConn.Close(); MyDG.DataSource = MyDataSet.Tables["Lieferanten"].DefaultView; MyDG.DataBind(); } </script> <html> <body> <form runat="server"> <asp:DataGrid id="MyDG" runat="server" Width="700" BorderColor="black" CellPadding="2" CellSpacing="2" HeaderStyle-BackColor="#f8d07a" /> </form> </body> </html>
Das Ergebnis sieht dann im Browser (mit den angewandten Formatoptionen) so aus:
Nachdem Sie sicherlich alle angeführten Artikel gelesen haben, haben Sie somit einen einfachen und sicheren Einstieg in ADO.NET erhalten. Sie können nun in ADO.NET Connections zu Datenbanken öffnen und zumindest die gewonnenen Daten übersichtlich am Browser darstellen. Sie haben die Option die Daten mit Hilfe eines read-only und forward-only Streams (DataReader) auszulesen und z.B. mit einem einfachen HTML Table strukturiert darzustellen.
Oder falls Sie die Daten auch nach dem Auslesen manipulieren möchten, schreiben Sie die Daten in ein disconnected DataSet. Dann können diese nach Schließen der aktiven Verbindung bzw. der Resourcenfreigabe ausgeben oder auch weiter bearbeiten (DataBind bzw. DataGrid).
Das ist aber nur ein sehr, sehr kleiner Ausschnitt von dem was ADO.NET alles kann. Wie Sie den Artikeln schon entnehmen können, ist ADO.NET um einiges verständlicher und strukturierter als die vorigen Versionen ADO. ADO.NET bietet einen riesigen Funktionsumfang, bleibt aber programmiertechnisch klar strukturiert und relativ einfach erlernbar - der Umstieg auf bzw. der Einsatz von ADO.NET lohnt sich auf jeden Fall!
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20001106.zip
Das DataTable Objekt in ADO.NET
http:/www.aspheute.com/artikel/20001116.htm
Das SQL Join Statement
http:/www.aspheute.com/artikel/20001023.htm
Datenbankzugriff mittels ADO.NET
http:/www.aspheute.com/artikel/20001102.htm
Der ODBC .NET Data Provider
http:/www.aspheute.com/artikel/20020206.htm
Einträge numerieren im DataGrid
http:/www.aspheute.com/artikel/20040317.htm
Schleifenbefehle in C#
http:/www.aspheute.com/artikel/20000717.htm
Stored Procedures 101 in ADO.NET
http:/www.aspheute.com/artikel/20010626.htm
Was ist neu in ADO.NET
http:/www.aspheute.com/artikel/20001031.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.