2015-06-17 13 views
9

Recentemente mi sono imbattuto in dichiarazioni di aggiornamento vba e ho utilizzato Recordset.Edit e Recordset.Update non solo per modificare i miei dati esistenti ma per aggiornarli.Recordset.Modifica o aggiorna l'istruzione sql vba più veloce per l'aggiornamento?

Desidero conoscere la differenza tra i due: recordset.update e Update sql Vba. Penso che tutti facciano lo stesso, ma non riesco a capire quale sia più efficiente e perché.

codice di esempio riportato di seguito:

'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 

Questo è per set di record (aggiornamento e modifica):

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

Quante righe sono selezionate da 'WHERE columnc = 20'? Una riga? Un milione di righe? – HansUp

+0

diciamo 1000 più –

risposta

7

Supponendo WHERE columnc = 20 seleziona 1000+ righe, come lei ha detto in un commento, esecuzione che L'istruzione UPDATE deve essere notevolmente più veloce del ciclo di un recordset e dell'aggiornamento delle righe una alla volta.

Quest'ultima strategia è un approccio RBAR (Row By Agonizing Row). La prima strategia, l'esecuzione di un singolo (valido) UPDATE, è un approccio "set-based". In generale, le trame RBAR basate su set rispetto alle prestazioni.

Tuttavia i tuoi 2 esempi sollevano altri problemi. Il mio primo suggerimento sarebbe quello di utilizzare DAO, invece di ADO per eseguire la vostra UPDATE:

CurrentDb.Execute stSQL, dbFailonError 

Qualunque di tali strategie si sceglie, assicurarsi ColumnC è indicizzato.

+0

E se seleziona solo 1 o poche righe, l'aggiornamento di Recordset sarebbe più veloce, giusto? –

6

Il metodo SQL è solitamente il più veloce per gli aggiornamenti di massa, ma la sintassi è spesso maldestra.

Il metodo VBA, tuttavia, presenta i vantaggi distintivi, che il codice è più pulito e che il recordset può essere utilizzato prima o dopo l'aggiornamento/modifica senza riqualificare i dati. Questo può fare una grande differenza se devi fare calcoli prolissi tra gli aggiornamenti. Inoltre, il recordset può essere passato da ByRef a funzioni di supporto o ulteriore elaborazione.

-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

Si prega di riformattare la risposta per renderlo migliore –

+0

Questo non risponde alla domanda. Volevi fare una domanda? Quindi, per favore fallo e fai una nuova domanda. Ma leggi [chiedi] prima. – Andre