connection.execute + default cursortype/locktype ändern

08/07/2009 - 21:15 von Josef Müller | Report spam
Hallo NG,

ich verwende in einem WSH folgende Befehle, um festzustellen, ob es den Satz
in der Tabelle gibt, um entweder ein Insert oder ein Update zu machen:

sql = "SELECT * FROM xTabelle where Key = 'X'"
set rs = cnn.Execute(sql)

if rs.eof = true Then
sql = "INSERT "
else
sql = "UPDATE ... "
End if
cnn.Execute sql

Obiges Konstrukt ist fast doppelt so schnell, wie im Vergleich dazu das
Folgende:

Set rs = CreateObject("ADODB.Recordset")

sql = "SELECT * FROM xTabelle where Key = 'X'"
rs.open sql, cnn, Cursortype, Locktype, Options

if rs.eof = true Then
rs.addnew
rs("Key") = "X"
rs("Feld2") = "Y"
rs("Feld3") = "Z"
else
rs("Feld2") = "Y"
rs("Feld3") = "Z"
End if
rs.update

Jetzt meine Frage:
gibt es eine Möglichkeit bei der ersten Variante den Default CursorType bzw.
LockType zu veràndern ?

Vielen Dank

lg
Josef
 

Lesen sie die antworten

#1 Alexander Mueller
16/07/2009 - 11:28 | Warnen spam
Josef Müller schrieb:

ich verwende in einem WSH folgende Befehle, um festzustellen, ob es den Satz
in der Tabelle gibt, um entweder ein Insert oder ein Update zu machen:

sql = "SELECT * FROM xTabelle where Key = 'X'"
set rs = cnn.Execute(sql)

if rs.eof = true Then
sql = "INSERT "
else
sql = "UPDATE ... "
End if
cnn.Execute sql

Obiges Konstrukt ist fast doppelt so schnell, wie im Vergleich dazu das
Folgende:

Set rs = CreateObject("ADODB.Recordset")
sql = "SELECT * FROM xTabelle where Key = 'X'"
rs.open sql, cnn, Cursortype, Locktype, Options

if rs.eof = true Then
rs.addnew
rs("Key") = "X"
rs("Feld2") = "Y"
rs("Feld3") = "Z"
else
rs("Feld2") = "Y"
rs("Feld3") = "Z"
End if
rs.update

Jetzt meine Frage:
gibt es eine Möglichkeit bei der ersten Variante den Default CursorType bzw.
LockType zu veràndern ?



CursorType und Locktype sind Recordset-spezifisch, d.h. Du kannst sie
nur einem Recorset-Objekt zuweisen, *bevor* Du es befüllst, also
Variante 2.
Ein Recordset, das von Connection.Execute erstellt wird, ist immer
adOpenForwardOnly und adLockReadOnly, das kann man nicht àndern.
D.h. du kannst so ein Recordset nicht beschreibbar machen und nichts
daran anfügen oder darin löschen.

Eventuell wàre es aber bei Varainte 2 hilfreich, nicht für jeden Satz
ein eigenes RS zu holen, sondern eines für alle Sàtze aus xTabelle.
Das Suchen des Keys geht mit Find u/o Filter.
Das Update ist mit UpdateBatch iirc effektiver und auch schneller
zu machen - ADO-classic ist bei mir schon etwas her... ;-) .

Die erste Abfrage wàre etwas schneller, wenn Du nur den Count holst:
"SELECT COUNT(*) as ANZAHL FROM xTabelle where Key = 'X'"


MfG,
Alex

Ähnliche fragen