2015-06-17 24 views
9

Geçenlerde vba güncelleme ifadeleri rastladım ve benim mevcut verileri düzenlemek için sadece ama güncellemek için Recordset.Edit ve Recordset.Update kullanıyoruz. recordset.update ve Update sql Vba açıklamada:Recordset.Edit veya güncelleştirmek için sql vba bildirimi en hızlı yolu?

İki arasındaki farkı bilmek istiyorum. Sanırım hepsi aynı şeyi yapıyor ama hangisinin daha verimli olduğunu ve neden olduğunu anlayamıyorum. Aşağıda

örnek kod:

'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 

Bu kayıt içindir (güncelleme ve Düzenleme): Bir açıklamada belirtildiği gibi

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

WHERE columnc = 20' tarafından kaç satır seçiliyor? Bir satır mı? Bir milyon satır mı? – HansUp

+0

1000 artı –

cevap

7

olduğunu yürütülmesi, WHERE columnc = 20 seçer 1000+ satırları varsayarsak UPDATE ifadesi, bir kayıt kümesinde döngü yapmaktan ve satırları birer birer güncelleştirmekten daha hızlı olmalıdır.

ikinci strateji bir yaklaşım, bir RBAR (Agonizing sıra sıra) 'dir. Tek bir geçerli (UPDATE) yürüten ilk strateji, "set-temelli" bir yaklaşımdır. Genel olarak, set-temelli performansa göre RBAR kozları.

Ancak sizin 2 örnekler diğer sorunlar doğurur. Benim ilk öneri, UPDATE yürütmek yerine ADO DAO kullanmak olacaktır: seçtiğiniz kişiler stratejilerin

CurrentDb.Execute stSQL, dbFailonError 

hangisi emin columnc endeksli olduğundan emin olun.

+0

diyelim Ve eğer sadece 1 veya birkaç satır seçerse, Recordset ile güncelleme daha hızlı olur, değil mi? –

6

SQL yöntemi genellikle toplu güncellemeler için en hızlı, ancak sözdizimi genellikle hantal olduğunu.

vba yöntem olup, ancak, bu kod temizdir, belirgin avantajlara sahiptir ve kayıt önce veya veri requering olmadan güncelleştirme/düzenleme sonra kullanılabilir. Güncellemeler arasında uzun soluklu hesaplamalar yapmanız gerekiyorsa, bu büyük bir fark yaratabilir. Ayrıca, kayıt kümesi ByRef'i destekleyici fonksiyonlara veya ileri işlemlere geçirebilir.

-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

Lütfen daha iyi hale getirmek için cevabınızı yeniden biçimlendirin –

+0

Bu soruları cevaplamıyor. Bir soru sormak istedin mi? O zaman lütfen bunu yap ve yeni bir soru sor. Ama önce [sor] 'u okuyun. – Andre