ADODB: Datenzugriff mit der Command-Klasse

Möchtest Du den gesamten Artikel lesen? Und vielleicht sogar den Artikel im PDF-Format und die Beispieldateien herunterladen? Dann hole Dir den Artikel gleich hier - völlig kostenlos!

In einem anderen Artikel namens “ADODB: SQL-Befehle schnell ausführen mit Execute” (www.vbentwickler.de/447) haben wir bereits gezeigt, wie wir unter ADO mit der Execute-Methode der Connection-Klasse schnell SQL-Anweisungen zum Manipulieren von Daten ausführen oder Daten abrufen und mit einem Recordset durchlaufen können. Allerdings gibt es gerade für den Austausch von Daten mit dem SQL Server noch einige weitere Möglichkeiten. Dazu benötigen wir allerdings die Command-Klasse. Sie bietet primär auch eine Execute-Methode, mit der wir die gleichen Dinge erledigen können, wie mit der gleichnamigen Methode der Connection-Klasse. Sie bietet allerdings viele weitere Optionen, mit denen wir zum Beispiel Parameter an eine gespeicherte Prozedur übergeben können.

Warum die Command-Klasse?

Die Command-Klasse ermöglicht es Dir, Abfragen und gespeicherte Prozeduren sehr flexibel und sicher auszuführen.

Während einfache SQL-Strings in der Connection.Execute-Methode direkt übergeben werden, kannst Du mit Command auch Parameter definieren. Das ist gerade bei dynamischen Abfragen oder bei wiederverwendbaren SQL-Prozeduren entscheidend.

Wichtige Eigenschaften und Methoden der Command-Klasse

Hier findest Du die wichtigsten Eigenschaften und Methoden der Command-Klasse:

  • ActiveConnection: Gibt an, mit welcher Connection das Command-Objekt verbunden ist.
  • Cancel: Bricht eine laufende Ausführung eines Command-Objekts ab.
  • CommandStream: Ermöglicht es, einen Stream (zum Beispiel XML) anstelle von SQL-Text zu verwenden.
  • CommandText: Enthält den SQL-Befehl oder den Namen einer gespeicherten Prozedur.
  • CommandTimeout: Gibt an, wie viele Sekunden gewartet wird, bevor ein Command abgebrochen wird.
  • CommandType: Bestimmt, wie der Inhalt von CommandText interpretiert wird (zum Beispiel Text, Tabelle, Prozedur).
  • CreateParameter: Erstellt einen neuen Parameter für das Command-Objekt.
  • Dialect: Gibt die Syntax an, die für CommandText verwendet wird (zum Beispiel SQL-Dialect).
  • Execute: Führt den Befehl aus und liefert optional ein Recordset zurück.
  • Name: Name des Command-Objekts, kann für spätere Referenzen verwendet werden.
  • NamedParameters: Gibt an, ob Parameter per Namen statt nach Reihenfolge übergeben werden.
  • Parameters: Sammlung aller Parameter, die dem Command-Objekt zugeordnet sind.
  • Prepared: Gibt an, ob das Command-Objekt vorbereitet/kompiliert ist, um schneller ausgeführt zu werden.
  • Properties: Sammlung zusätzlicher Eigenschaften, die für das Command-Objekt gelten.
  • State: Zeigt den aktuellen Status des Command-Objekts an (zum Beispiel geöffnet oder geschlossen).

Grundaufbau eines Command-Objekts

Ein Command-Objekt besteht grundsätzlich aus der Zuweisung der Connection, der Angabe des SQL-Befehls (oder Prozedurnamens) und der Einstellung des CommandType.

Danach kannst Du über die Parameters-Auflistung Parameter hinzufügen und konfigurieren. Schließlich rufst Du die Execute-Methode auf, um den Befehl auszuführen oder ein Recordset zu erhalten.

Im folgenden Beispiel öffnen wir ein Recordset mit Hilfe eines Command-Objekts und geben die Inhalte direkt im Direktbereich aus:

Public Sub KundenPerCommand()
     Dim cnn As ADODB.Connection
     Dim cmd As ADODB.Command
     Dim rst As ADODB.Recordset
     Set cnn = CurrentProject.Connection
     Set cmd = New ADODB.Command
     cmd.ActiveConnection = cnn
     cmd.CommandText = "SELECT * FROM tblKunden"
     cmd.CommandType = adCmdText
     Set rst = cmd.Execute
     Do Until rst.EOF
         Debug.Print rst!Vorname & " " & rst!Nachname
         rst.MoveNext
     Loop
     rst.Close
     Set rst = Nothing
     Set cmd = Nothing
     Set cnn = Nothing
End Sub

ActiveConnection

Die Eigenschaft ActiveConnection legt fest, welche Verbindung das Command-Objekt verwendet. Meist weist Du hier eine bestehende Connection zu, damit das Command-Objekt genau weiß, gegen welche Datenbank es ausgeführt werden soll. Beispiel:

Set cmd.ActiveConnection = cnn
cmd.CommandText = "SELECT * FROM tblKunden"

Cancel

Mit der Methode Cancel kannst Du einen laufenden Command-Vorgang abbrechen. Dies ist hilfreich, wenn ein Befehl sehr lange dauert oder der Benutzer den Vorgang abbricht. Beispiel:

cmd.Execute
cmd.Cancel

CommandStream

Die Eigenschaft CommandStream erlaubt es, anstelle von SQL-Text einen Datenstrom (Stream) an ein Command-Objekt zu übergeben. Meist handelt es sich dabei um einen XML-Stream oder einen anderen binären Datenstrom, der als Eingabe für einen Befehl dient.

Ein typisches Szenario ist der Import großer XML-Datenmengen in eine Datenbank oder das Ausführen von gespeicherten XML-Abfragen, die nicht als reiner Text übergeben werden sollen. In solchen Fällen wird ein Stream-Objekt erstellt (zum Beispiel mit der ADODB.Stream-Klasse), befüllt und dann der Eigenschaft CommandStream zugewiesen.

Beispiel (verkürzt dargestellt):

Dim stm As ADODB.Stream
Set stm = New ADODB.Stream
stm.Open
stm.WriteText "<root><datensatz>...</datensatz></root>"
Set cmd.CommandStream = stm
cmd.CommandType = adCmdText
cmd.Execute

Die Verwendung von CommandStream ist eher selten und wird vor allem in komplexeren Szenarien mit XML-Daten, BLOBs (Binary Large Objects) oder bei bestimmten Webservice-Integrationen eingesetzt. In klassischen Access- und SQL Server-Szenarien spielt diese Eigenschaft nur eine untergeordnete Rolle.

CommandText

Hier gibst Du den eigentlichen SQL-Befehl oder den Namen einer gespeicherten Prozedur an. Beispiel:

cmd.CommandText = "SELECT * FROM tblKunden"
cmd.CommandType = adCmdText

CommandTimeout

Mit CommandTimeout legst Du die maximale Zeit in Sekunden fest, die auf die Ausführung des Befehls gewartet wird. Beispiel:

cmd.CommandTimeout = 30

CommandType

Mit CommandType steuerst Du, wie Access den Inhalt von CommandText interpretiert (Text, Tabelle, Prozedur et cetera). Beispiel:

cmd.CommandType = adCmdText

Die folgenden Werte können wir für die Eigenschaft CommandType verwenden:

  • adCmdUnknown (8): Standardwert, wenn der Typ des Befehls nicht angegeben ist. ADO versucht selbst zu erkennen, ob es sich um einen SQL-Text, eine Tabelle oder eine Prozedur handelt. Sollte möglichst vermieden werden, da es zu unerwartetem Verhalten führen kann.
  • adCmdText (1): Gibt an, dass der Befehl ein SQL-Textbefehl ist (zum Beispiel SELECT-, UPDATE– oder DELETE-Befehl). Dies ist der am häufigsten verwendete Typ für direkte SQL-Strings.
  • adCmdTable (2): Verweist auf eine ganze Tabelle. ADO erzeugt intern ein SELECT * FROM [Tabelle]. Ideal, wenn alle Datensätze einer Tabelle ohne Filter geladen werden sollen.
  • adCmdStoredProc (4): Kennzeichnet eine gespeicherte Prozedur. Wird verwendet, um auf SQL Server oder anderen Datenbanken gespeicherte Prozeduren auszuführen.
  • adCmdFile (256): Verweist auf eine Persisted Recordset-Datei, also eine gespeicherte Daten-Datei (zum Beispiel .adtg). Wird selten genutzt, wenn Daten aus einer Datei gelesen oder in eine Datei geschrieben werden.
  • adCmdTableDirect (512): Öffnet die Tabelle direkt, ohne SQL-Parsing oder weitere Verarbeitung. Sehr schnelle Methode, aber ohne Filter oder Sortierungen. Nur für einfache Lesezugriffe geeignet.

CreateParameter

Mit CreateParameter erstellst Du einen neuen Parameter für Dein Command-Objekt. Dies ist vor allem nützlich bei gespeicherten Prozeduren oder dynamischen SQL-Abfragen. Der folgende Parameter übergibt den Wert 5 als Parameter für das Feld KundenID:

Set prm = cmd.CreateParameter("KundenID", adInteger, adParamInput, , 5)
cmd.Parameters.Append prm

Dialect

Die Eigenschaft Dialect gibt an, welche SQL-Syntax oder welcher Dialekt für CommandText verwendet werden soll. Meist wird der Standard-SQL-Dialekt genutzt, sodass diese Eigenschaft oft nicht explizit gesetzt wird.

Dialect

Die Eigenschaft Dialect gibt an, welche Abfragesyntax das Command-Objekt für den Inhalt von CommandText verwenden soll. Standardmäßig wird der SQL-Dialekt des verwendeten Providers (meist ANSI SQL) genutzt. Folgende Werte können je nach Provider genutzt werden:

  • adCmdUnknown (-1): Der Dialekt ist nicht angegeben und wird automatisch vom Provider bestimmt.
  • adCmdText (1): Verwendet klassischen SQL-Text, der meist ANSI SQL entspricht.
  • adCmdTable (2): Interpretiert den Befehl als Tabellenname.
  • adCmdStoredProc (4): Verwendet den Namen einer gespeicherten Prozedur.

Zusätzlich gibt es bei einigen OLE DB Providern proprietäre Dialekte, die über eine Dialekt-URI (Uniform Resource Identifier) angegeben werden können, zum Beispiel für XML-Datenquellen. In der Praxis wird Dialect sehr selten explizit gesetzt, da der Standardwert für die meisten SQL-Statements vollkommen ausreichend ist.

Erst bei speziellen XML- oder proprietären Abfragen ist es nötig, diesen Wert explizit festzulegen.

Execute

Mit Execute führst Du das Command aus und erhältst optional ein Recordset zurück. Beispiel:

Set rst = cmd.Execute

Die Execute-Methode und ihre Parameter

Mit der Methode Execute führst Du ein Command-Objekt aus. Dabei kannst Du verschiedene Parameter verwenden, um das Verhalten der Ausführung zu steuern. Die grundlegende Syntax lautet:

Set rst = cmd.Execute(RecordsAffected, Parameters, _
     Options)
  • RecordsAffected: Diese optionale Variable (meist vom Typ Long) gibt zurück, wie viele Datensätze von der Aktion betroffen waren, zum Beispiel bei UPDATE– oder DELETE-Befehlen.
  • Parameters: Wird bei der Command-Klasse meist nicht verwendet, da Parameter über die Parameters-Auflistung verwaltet werden. Bei einfachen Execute-Aufrufen ohne Command-Objekt kann dieser Parameter jedoch genutzt werden.
  • Options: Mit diesem Parameter kannst Du steuern, wie ADO den Befehl interpretiert. Zum Beispiel kannst Du hier angeben, ob der Befehl als Text kommt (adCmdText) oder als gespeicherte Prozedur (adCmdStoredProc). Wird oft zusammen mit einfachen Execute-Aufrufen ohne Command-Objekt verwendet.

Wenn Du die Command-Klasse mit vorher definierten Parametern nutzt, brauchst Du meist nur RecordsAffected als Rückgabewert. Beispiel:

Dim lngBetroffen As Long
cmd.Execute lngBetroffen
Debug.Print lngBetroffen & " Datensätze wurden aktualisiert."

Mit diesen Parametern kannst Du also noch genauer steuern, wie Dein SQL-Befehl ausgeführt wird, und erhältst wichtige Rückmeldungen über das Ergebnis.

Name

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar