我最近遇到了vba更新语句,我一直在使用Recordset.Edit
和Recordset.Update
来编辑现有数据,但不仅要更新它。
我想知道两者之间的区别:recordset.update
和Update sql Vba
声明。我认为他们都做同样的事情,但我无法确定哪一个更有效,为什么。
以下示例代码:
'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
这是记录集(更新和编辑):
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 :(得分:7)
假设WHERE columnc = 20
选择1000多行,正如您在评论中提到的那样,执行UPDATE
语句应该明显快于循环记录集并一次更新一行。
后一种策略是RBAR(Row By Agonizing Row)方法。执行单个(有效)UPDATE
的第一个策略是基于集合的""做法。通常,基于集合在性能方面胜过RBAR。
然而,你的两个例子提出了其他问题。我的第一个建议是使用DAO而不是ADO来执行UPDATE
:
CurrentDb.Execute stSQL, dbFailonError
无论您选择哪种策略,都要确保将 columnc 编入索引。
答案 1 :(得分:6)
对于批量更新,SQL方法通常是最快的,但语法通常很笨拙。
然而,VBA方法具有明显的优点,即代码更清晰,并且可以在更新/编辑之前或之后使用记录集而无需重新获取数据。如果您必须在更新之间进行冗长的计算,这可能会产生巨大的差异。此外,记录集可以通过ByRef传递给支持函数或进一步处理。
答案 2 :(得分:0)
我发现,当我需要按顺序更新表中的每条记录时,例如在使用自动编号时添加顺序ID不可行,添加运行总计,或基于该值的任何增量计算。记录集,它的DAO方法要快得多。
如果您的数据不是按照需要处理的顺序排列的,而是需要依赖与数据源匹配的值,那么SQL效率会大大提高。
答案 3 :(得分:-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