DevTrain

Autor: Bernhard Elbl

Ein Vorteil des Command-Objektes von ADO

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!


Erfasst am: 04.04.2001 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=414
© Copyright 2003 ppedv AG - http://www.ppedv.de