12.4 Daten lesen mit SqlCommand und OleDbCommand
 
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:
|
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). |
|
E ExecuteNonQuery führt solche Befehle aus, die keine Tabellenzeilen zurückgeben, wie z. B. die SQL-Anweisungen INSERT, DELETE, SET und UPDATE. |
|
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.
12.4.1 ExecuteReader
 
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:
|
einen SQL-Befehl oder |
|
den Namen einer Stored Procedure oder |
|
den Namen einer Tabelle. |
Mit der Eigenschaft CommandType legen Sie fest, welche Art von Eintrag CommandText enthält:
|
E CommandType.Text ist die Default-Einstellung. Damit sind SQL-Befehle möglich. |
|
E CommandType.StoredProcedure |
|
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.
12.4.2 ExecuteNonQuery und die Parameters-Collection
 
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.
12.4.3 ExecuteScalar
 
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>
 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
|