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