2015-06-17 13 views
9

Ich kam vor kurzem in vba Update-Anweisungen und ich habe Recordset.Edit und Recordset.Update benutze nur meine vorhandenen Daten nicht zu bearbeiten, sondern sie zu aktualisieren.Recordset.Edit oder Update sql vba Aussage schnellste Möglichkeit zu aktualisieren?

Ich möchte den Unterschied zwischen den beiden wissen: recordset.update und Update sql Vba Anweisung. Ich denke, dass alle dasselbe tun, aber ich kann mir nicht vorstellen, welches effizienter ist und warum.

Beispiel-Code unten:

'this is with sql update statement 
dim someVar as string, anotherVar as String, cn As New ADODB.Connection 

someVar = "someVar" 
anotherVar = "anotherVar" 

sqlS = "Update tableOfRec set columna = " &_ 
     someVar & ", colunmb = " & anotherVar &_ 
            " where columnc = 20"; 

cn.Execute stSQL 

Dieses für Cord-Set ist (Update und Bearbeiten):

dim thisVar as String, someOthVar as String, rs as recordset 
thisVar = "thisVar" 
someOthVar = "someOtherVar" 


set rs = currentDb.openRecordset("select columna, columnb where columnc = 20") 
do While not rs.EOF 
    rs.Edit 
    rs!columna = thisVar 
    rs!columnb = someOthvar 
    rs.update 

    rs.MoveNext 
loop 
+0

Wie viele Zeilen werden von 'WHERE columnc = 20' ausgewählt? Eine Reihe? Eine Million Zeilen? – HansUp

+0

werfen sie ein 1000 sagen und –

Antwort

7

Unter der Annahme, WHERE columnc = 20 wählt 1000 Zeilen, wie Sie in einem Kommentar erwähnt, ausgeführt wird, dass Die Anweisung sollte merklich schneller sein als das Durchlaufen eines Recordsets und das Aktualisieren der einzelnen Zeilen.

Diese Strategie ist ein RBAR (Row von Agonizing Row) Ansatz. Die erste Strategie, die eine einzige (gültige) UPDATE ausführt, ist ein "Satz-basierter" Ansatz. Im Allgemeinen übertrumpft set-based RBAR in Bezug auf die Leistung.

jedoch Ihre 2 Beispiele heben andere Fragen. Mein erster Vorschlag DAO wäre anstelle von ADO zu verwenden, um Ihre UPDATE auszuführen:

CurrentDb.Execute stSQL, dbFailonError 

Unabhängig davon, welche dieser Strategien, die Sie wählen, stellen Sie sicher, dass columnc indiziert ist.

+0

Und wenn es nur 1 oder ein paar Zeilen auswählt, würde das Update durch Recordset schneller sein, nicht wahr? –

6

Die SQL-Methode ist in der Regel die schnellste für Bulk-Updates, aber Syntax ist oft ungeschickt.

Die VBA Verfahren haben jedoch die deutlichen Vorteile, dass Code ist sauberer und das Datensatzgruppe kann ohne requering die Daten vor oder nach der Aktualisierung/Bearbeiten verwendet werden. Dies kann einen großen Unterschied machen, wenn Sie zwischen den Aktualisierungen langatmige Berechnungen durchführen müssen. Darüber hinaus kann das Re-Cord-Set ByRef an unterstützende Funktionen oder Weiterverarbeitung übergeben werden.

-1
Dim rs As DAO.Recordset 
Set rs = CurrentDb.OpenRecordset("select invoice_num from dbo_doc_flow_data where barcode = '" & Me.barcode_f & "'") 
Do While Not rs.EOF 
      rs.Edit 
      rs!invoice_num = Me!invoice_num_f 
      rs.Update 
      rs.MoveNext 
Loop 
      rs.Close 
+0

Bitte formatieren Sie Ihre Antwort um es besser zu machen –

+0

Dies beantwortet die Frage nicht. Wolltest du eine Frage stellen? Dann tu das bitte und stelle eine neue Frage. Aber lies zuerst [frag]. – Andre

Verwandte Themen