DevTrain .NET Developers Home. Das Community Portal für ASP.NET, Visual Basic, C#
 
  Login Status: Hallo   Anmelden  Suche:  
Navigationslinks überspringen
Startseite
Artikel
Blogs
Foren
ClubClub erweitern

 
Ihre Optionen
Save
Mail
Print
Rate
 
Advertising
  VSone vom 24.-25. Februar 2010 im ehem. IMAX München

 
Navigationslinks überspringen
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!


Diskutieren Sie in den Foren

VSone vom 24.-25. Februar 2010 im ehem. IMAX München