Recordset.Edit还是更新sql vba语句最快的更新方式?

时间:2015-06-17 14:09:29

标签: sql vba ms-access access-vba ms-access-2003

我最近遇到了vba更新语句,我一直在使用Recordset.EditRecordset.Update来编辑现有数据,但不仅要更新它。

我想知道两者之间的区别:recordset.updateUpdate 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 

4 个答案:

答案 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