2015-06-17 45 views
9

Niedawno spotkałem się z instrukcjami aktualizacji vba i używam Recordset.Edit i Recordset.Update, aby nie tylko edytować moje istniejące dane, ale również je aktualizować.Zestaw Recordset.Edit lub Update sql vba najszybszym sposobem aktualizacji?

Chcę poznać różnicę między dwoma oświadczeniami: recordset.update i Update sql Vba. Myślę, że wszyscy robią to samo, ale nie potrafię określić, który z nich jest skuteczniejszy i dlaczego.

Przykładowy kod poniżej:

'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 

To dla rekordów (aktualizacja i Edit):

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

Ile wierszy jest wybranych przez "WHERE columnc = 20"? Jeden rząd? Milion wierszy? – HansUp

+0

Załóżmy, że 1000 plus –

Odpowiedz

7

Zakładając WHERE columnc = 20 wybiera ponad 1000 wierszy, jak wspomniano w komentarzu, że wykonanie Oświadczenie UPDATE powinno być zauważalnie szybsze niż przechodzenie przez zestaw rekordów i aktualizowanie wierszy pojedynczo.

Ta druga strategia to podejście RBAR (Row By Agonizing Row). Pierwsza strategia, realizująca pojedyncze (poprawne) UPDATE, jest podejściem "opartym na zestawie". Ogólnie rzecz biorąc, zależne od zestawu atrybuty RBAR odnoszą się do wydajności.

Jednak Twoje 2 przykłady podnoszą inne problemy. Moja pierwsza sugestia byłoby użyć DAO zamiast ADO wykonać swoją UPDATE:

CurrentDb.Execute stSQL, dbFailonError 

którąkolwiek z tych strategii do wyboru, upewnij columnc jest indeksowana.

+0

A jeśli wybierze tylko 1 lub kilka wierszy, aktualizacja zestawu rekordów będzie szybsza, prawda? –

6

Metoda SQL jest zwykle najszybsza dla aktualizacji zbiorczych, ale składnia jest często niezgrabna.

Metoda VBA ma jednak wyraźne zalety, że kod jest czystszy, a zestaw rekordów może być używany przed aktualizacją/edycją lub po niej, bez konieczności podawania danych. Może to być ogromna różnica, jeśli musisz wykonać obliczenia z długimi czasami trwania pomiędzy aktualizacjami. Ponadto zestaw rekordów można przekazać ByRef do obsługi funkcji lub dalszego przetwarzania.

-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

Proszę sformatować odpowiedź, aby była lepsza. –

+0

To nie odpowiada na pytanie. Czy chcesz zadać pytanie? Następnie zrób to i zadaj nowe pytanie. Ale najpierw przeczytaj [zapytaj]. – Andre