Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Einstieg in ASP.NET von Matthias Lohrer
Einstieg in ASP.NET
gp Kapitel 12 ASP.NET und Datenbanken
  gp 12.1 Auf Datenbanken zugreifen – ein Crashkurs
    gp 12.1.1 Eine Tabelle im Browser anzeigen
    gp 12.1.2 Über den Browser einen Datensatz hinzufügen
  gp 12.2 Wie ADO.NET funktioniert – ein Überblick
  gp 12.3 Die Verbindung zur Datenbank herstellen
    gp 12.3.1 OleDbConnection
    gp 12.3.2 SqlConnection
  gp 12.4 Daten lesen mit SqlCommand und OleDbCommand
    gp 12.4.1 ExecuteReader
    gp 12.4.2 ExecuteNonQuery und die Parameters-Collection
    gp 12.4.3 ExecuteScalar
  gp 12.5 SqlDataReader und OleDbDataReader
    gp 12.5.1 Ein Reader-Objekt an ein Steuerelement binden
    gp 12.5.2 Ein Reader-Objekt an ein Listensteuerelement binden
    gp 12.5.3 Ein Reader-Objekt zeilenweise auswerten
  gp 12.6 Die DataSet-Klasse
    gp 12.6.1 Das Zusammenspiel von Command, Adapter und DataSet
    gp 12.6.2 Mehrere Tabellen in ein DataSet-Objekt einlesen
    gp 12.6.3 Auf einzelne Zeilen, Spalten und Tabellen eines DataSet-Objekts gezielt zugreifen
    gp 12.6.4 Relationen zwischen Tabellen festlegen
  gp 12.7 DataViews verwenden
    gp 12.7.1 Tabellen sortieren
    gp 12.7.2 Tabellen nach Inhalten filtern
    gp 12.7.3 Nach dem Zeilenstatus filtern
    gp 12.7.4 In Tabellen suchen
  gp 12.8 Mit ASP.NET Daten bearbeiten
  gp 12.9 Daten bearbeiten mit dem Command-Objekt
  gp 12.10 In-Place-Editing mit dem DataGrid-Steuerelement
    gp 12.10.1 Die EditItemIndex-Eigenschaft
    gp 12.10.2 Das asp:DataGrid-Tag anpassen
    gp 12.10.3 OnEditCommand: Daten bearbeiten
    gp 12.10.4 OnCancelCommand: Die Bearbeitung abbrechen
    gp 12.10.5 OnUpdateCommand: Die Änderungen sichern
    gp 12.10.6 Das Repeater-Steuerelement verwenden
    gp 12.10.7 Die Ereignisse des Repeater-Steuerelements auswerten
  gp 12.11 Das DataList-Steuerelement
    gp 12.11.1 In-Place-Editing mit dem DataList-Steuerelement


Galileo Computing

12.4 Daten lesen mit SqlCommand und OleDbCommand  downtop

Mit Hilfe der Klassen OleDbCommand beziehungsweise SqlCommand führen Sie ein Datenbankkommando aus. Hier können Sie SQL-Statements angeben oder gespeicherte Prozeduren anstoßen. OleDbCommand kennt drei Methoden:

gp  E ExecuteReader führt solche Befehle aus, die Tabellenzeilen als Ergebnis zurückgeben, z. B. SELECT * FROM table_x, und liefert das Resultat in Form eines Objekts vom Typ OleDbDataReader (SqlDataReader).
gp  E ExecuteNonQuery führt solche Befehle aus, die keine Tabellenzeilen zurückgeben, wie z. B. die SQL-Anweisungen INSERT, DELETE, SET und UPDATE.
gp  E ExecuteScalar führt solche Befehle aus, die einen einzelnen Wert, z. B. einen Aggregatwert, zurückgeben.

Die Klasse SqlCommand fügt diesen drei Methoden noch die Methode ExecuteXmlReader hinzu. Diese Methode arbeitet wie ExecuteReader und gibt das Ergebnis als Objekt vom Typ XmlReader zurück.


Galileo Computing

12.4.1 ExecuteReader  downtop

Die Methode ExecuteReader sendet den Inhalt von CommandText unter Berücksichtigung von CommandType an die Datenbankverbindung und stellt das Ergebnis in einem Objekt vom Typ OleDbDataReader zur Verfügung.

Die Eigenschaft CommandText kann drei Arten von Einträgen aufnehmen:

gp  einen SQL-Befehl oder
gp  den Namen einer Stored Procedure oder
gp  den Namen einer Tabelle.

Mit der Eigenschaft CommandType legen Sie fest, welche Art von Eintrag CommandText enthält:

gp  E CommandType.Text ist die Default-Einstellung. Damit sind SQL-Befehle möglich.
gp  E CommandType.StoredProcedure
gp  E CommandType.TableDirect

Mit CommandType.TableDirect haben Sie die Möglichkeit, eine komplette Tabelle einzulesen. In diesem Fall geben Sie in CommandText lediglich den Namen der Tabelle an.

Im einleitenden Abschnitt 12.1, Auf Datenbanken zugreifen – ein Crashkurs, hat die Beispielseite db_01.aspx den Zugriff auf eine Tabelle mit der Methode ExecuteReader gezeigt. Nachdem eine Verbindung zur Datenbank aufgebaut wurde, lauten die entscheidenden Code-Zeilen:

   Dim sql As String
sql = "SELECT * FROM Versandfirmen"
Dim cmd As New OleDbCommand(sql, conn)
Dim myDataReader As OleDbDataReader
myDataReader = cmd.ExecuteReader()
myGrid.DataSource = myDataReader
DataBind()

Die Klasse OleDbCommand bietet vier verschiedene Konstruktoren an. Mit der Zeile

Dim cmd As New OleDbCommand(sql, conn)

werden die Eigenschaften CommandText und Connection definiert. Nach der Deklaration eines OleDbDataReader-Objekts kann die Reader-Klasse mit einer Zeile gefüllt werden:

myDataReader = cmd.ExecuteReader()

Das Reader-Objekt lässt sich schließlich als Datenquelle an das DataGrid-Steuerelement binden.

myGrid.DataSource = myDataReader  
DataBind()

Da der Code die Eigenschaft CommandType nicht explizit setzt, geht ASP.NET von der Standardeigenschaft CommandType.Text aus, mit der sich SQL-Befehle ausführen lassen.


Galileo Computing

12.4.2 ExecuteNonQuery und die Parameters-Collection  downtop

Die Methode ExecuteNonQuery verwenden Sie für solche SQL-Befehle, die keine Datensätze als Ergebnis zurückgeben. Dazu zählen z. B. INSERT, UPDATE, DELETE, das Erstellen von Tabellen und die Abfrage von Datenbankstrukturen.

Der einleitende Abschnitt 12.1, Auf Datenbanken zugreifen – ein Crashkurs, hat mit db_02.aspx auch hierfür ein kleines Beispiel gebracht. Bei einem Postback wurde an die Tabelle Versandfirmen ein neuer Datensatz mit den Angaben des Anwenders angefügt.

   If IsPostBack Then
      Dim iCmd As New OleDbCommand()
      iCmd.Connection = conn
      iCmd.Parameters.Add("@Firma", txtFirma.value)
      iCmd.Parameters.Add("@Telefon", txtTelefon.value) 
      iCmd.CommandText = "INSERT INTO Versandfirmen "
      iCmd.CommandText += "(Firma, Telefon) "
      iCmd.CommandText += "VALUES (@Firma, @Telefon)"
      iCmd.ExecuteNonQuery()
   End If

Der SQL-Befehl, der in CommandText gespeichert wird, enthält noch nicht die genauen Angaben für die hinzuzufügende Firma und die Telefonnummer, sondern zunächst nur die Platzhalter @Firma und @Telefon. Die Methode ExecuteNonQuery() ersetzt diese Platzhalter gegen die Werte, die in der zugehörigen OleDbParameterCollection gespeichert sind. Diese Collection ist über die Parameters-Eigenschaft zugänglich. Mit der Add-Methode fügen Sie Parameter hinzu.

      iCmd.Parameters.Add("@Firma", txtFirma.value)
      iCmd.Parameters.Add("@Telefon", txtTelefon.value)

Achtung   Diese Add-Methode sieht intelligenter aus, als sie in Wirklichkeit ist. Tatsächlich unterstützt der OLE-DB-.NET-Provider gar keine benannten Parameter, sondern wertet die Parameter einfach in der Reihenfolge aus, in der sie ihm mitgeteilt werden. Wenn Sie die beiden Zeilen iCmd.Parameters.Add ... gegeneinander austauschen und erneut einen Test ausführen, werden Sie sehen, dass dann die Telefonnummer in der Spalte für den Firmennamen erscheint und andersherum.

Wenn Sie die Parameter nicht nur in der richtigen Reihenfolge hinzufügen, sondern gleichzeitig auch benennen, hat das den Vorteil, dass bei einem Wechsel zur SqlCommand-Klasse an dieser Stelle keine Änderung erforderlich ist, denn der SQL-Server-.NET-Provider verwendet benannte Parameter.


Galileo Computing

12.4.3 ExecuteScalar  toptop

Wenn Sie lediglich einen einzelnen Wert aus einer Datenbank extrahieren möchten, dann bietet die Methode ExecuteScalar hierfür die effizienteste Möglichkeit. Mit ExecuteScalar können Sie Aggregatwerte, aber auch die Inhalte einzelner Tabellenzellen auslesen.

db_05.aspx demonstriert, wie Sie mit der Methode ExecuteScalar beispielsweise die Anzahl der vorhandenen Tabellenzeilen ermitteln können. Abbildung 12.7 zeigt die Darstellung im Browser.

<!-- db_05.aspx --> 
<%@ Page Language="VB" Debug="True" Strict="True" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
Sub Page_Load (ByVal Sender As Object, _
               ByVal E As EventArgs)
   ' Verbindungszeichenfolge zusammensetzen
   Dim connStr As String 
   connStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
   connStr += _
  "Data Source=E:\ASPdotNETBuch\Listings\Nordwind.mdb;"

   ' Verbindung zur Datenbank herstellen
   Dim conn As New OleDbConnection(connStr)
   conn.Open()
   
   ' SQL-Kommando erstellen und ausführen
   Dim sql As String
   sql = "SELECT COUNT (*) FROM Versandfirmen"
   Dim cmd As New OleDbCommand(sql, conn)
   Dim ergebnis As String
   ergebnis = cmd.ExecuteScalar().toString()
   Dim t As String
   t = "Die Tabelle Versandfirmen hat " & _
       ergebnis & " Zeilen. <br>" & _ 
       "Das Kommando lautet: " & _
       cmd.CommandText & "<br>" & _
       "Der Kommandotyp ist: " & _
       cmd.CommandType
       
   ausgabe.innerHTML = t
   
End Sub
</script>
<html><head><title>
Demo zu OleDbCommand.ExecuteScalar
</title></head>
<body>
<h3>Demo zu OleDbCommand.ExecuteScalar</h3>
<p runat="server" id="ausgabe" />
</body></html>

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 12.7 Mit der Methode ExecuteScalar rufen Sie einzelne Werte aus einer Datenbank ab.

ExecuteScalar gibt stets ein Objekt vom Typ Object zurück, so dass Sie das Ergebnis in der Regel zunächst konvertieren sollten. Mit cmd.ExecuteScalar().toString() schließen Sie an den Aufruf der Methode direkt die Konvertierung zu einem String an.

   Dim ergebnis As String
   ergebnis = cmd.ExecuteScalar().toString()

Konstruktoren
New()
New(String)
New (String, OleDbConnection)
New (String, OleDbConnection, OleDbTransaction)
Der übergebene String enthält den CommandText.
Eigenschaften
CommandText String SQL-Anweisung oder Name der gespeicherten Prozedur oder der Name der Tabelle (dann: CommandType = "TableDirect")
CommandTimeOut Integer Anzahl Sekunden, die bei Befehlsausführung gewartet wird, bis ein Fehler generiert wird
CommandType CommandType Gültige Werte sind: Text (Default), StoredProcedure, TableDirect.
Connection OleDbConnection Die verwendete Verbindung
Parameters OleDbParameterCollection Die Parameter der SQL-Anweisung oder der gespeicherten Prozedur, sofern nötig
Transaction OleDbTransaction Die Transaktion, in der das Kommando ausgeführt wird
UpdatedRowSource UpdateRowSource Gibt an, wie Ergebnisse von Abfragebefehlen auf die aktualisierte Zeile angewendet werden
Methoden
Cancel() Versucht, die Ausführung eines Befehls abzubrechen
CreateParameter() OleDBParameter Erstellt eine neue Instanz eines OleDbParameter-Objekts
ExecuteNonQuery() Integer Führt die Anweisung (CommandText) aus und gibt die Anzahl der betroffenen Zeilen oder –1 zurück
ExecuteReader() OleDbDataReader Führt die Anweisung aus und liefert die gefundenen Tabellenzeilen in einem OleDbDataReader-Objekt
ExecuteScalar() Object Führt die Anweisung aus und gibt den Wert der ersten Zeile der ersten Spalte zurück
Prepare() Erstellt für den Befehl eine vorbereitete Version
ResetCommandTimeout() Setzt die CommandTimeout-Eigenschaft auf den Standardwert (30 s) zurück

Tabelle 12.3 Steckbrief der Klasse OleDbCommand

  

Einstieg in VB.NET

VB.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML




Copyright © Galileo Press GmbH 2003
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de