Mit Hilfe des Command-Objektes von ADO kann ich einer Tabelle einen Datensatz genauso zufügen, wie mit Recordset-Objekt. Das Command-Objekt bietet jedoch den Vorteil, die Datenbank auf eine Abfrage vorzubereiten(zu kompilieren) und diese Abfrage dann mit anderen Werten wiederholt auszuführen.
Außerdem habe ich die Möglichkeit ein SQL-Statement unvollständig zu erstellen und das Statement kurz vor dem Ausführen zu vervollständigen (wie im Beispiel). Das bringt den Vorteil, daß ein durch Strings und Variablen erstelltes SQL-Statement einem zufälligen Fehler vorbeugt.
Hier ein Fall in dem es zu so einem Fehler kommen kann:
folgendes Statement läuft über mit dem Recordset- und dem Command-Objekt
strSQL = "INSERT INTO kunden(name,vorname) VALUES ('elbl', 'bernhard')" |
dieses Statement verursacht im Recordset-Objekt einen Fehler
strSQL = "INSERT INTO kunden(name,vorname) VALUES ('O'Niel', 'James')" |
da sich im Namen ein Apostrophe (') befindet. Für das Command-Objekt ist das kein Problem.
Warum? ist im Beispiel zu sehen!
<% ' ---------- Der Connectionstring strConn = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=admin;" strConn = strConn & "Initial Catalog=Northwind;Data Source=W2KServer;" ' ---------- Instanziieren und öffnen des Connection-Objektes set conn = Server.CreateObject("ADODB.Connection") conn.Open strConn ' ---------- Instanziieren des Command-Objektes set cm = Server.CreateObject("ADODB.Command") ' ---------- Zu weisen der geöffneten Connection cm.ActiveConnection = conn ' ---------- CommandText(SQL-String) zuweisen cm.CommandText = "INSERT INTO be_command(b_text,b_zahl,b_name) VALUES(?,?,?);" ' ---------- Erstellen einer kompilierten Version der Abfrage*** cm.Prepared = true ' ---------- Parameter anfügen(FeldName,Typ,,Größe) cm.Parameters.Append cm.CreateParameter("b_text",adBSTR,,255) cm.Parameters.Append cm.CreateParameter("b_zahl",adInteger,,50) cm.Parameters.Append cm.CreateParameter("b_name",adBSTR,adParamInput,256) ' ---------- Tabellen-Felder Werte übergeben cm("b_text") = "Brenner" cm("b_zahl") = 2 cm("b_name") = "LiteOn" ' ---------- Ausführen bzw Speichern der Werte cm.Execute ' ---------- Jetzt kann ich den Vorgang wiederholen cm("b_text") = "Monitor" cm("b_zahl") = 5 cm("b_name") = "Eizo" ' ---------- Ausführen bzw Speichern der Werte cm.Execute ' ---------- Connection schließen und zerstören conn.Close set conn = nothing %> |
*** in dem ich die Eigenschaft "Prepared" des Command-Objektes auf true setze, sage ich der Datenbank, dass die Version des Statements kompiliert werden soll. Bei wiederholten ausführen ab einem 2.-en Execute spreche ich dann die kompilierte Version an. So erreiche ab dem 2.mal eine bessere Performance. Bei dem ersten Execute wird die Abfrage kompiliert. Dies braucht Zeit, die Abfrage ist beim 1.-en Execute mit Prepared also langsamer!