删除所有表的记录,并使用VBA将其替换为另一个表的记录

时间:2014-08-22 00:47:43

标签: sql vba dao

我不太清楚为什么这不起作用。调试给我一个错误:
Item not found for rs2.Fields(fld) = rs1.Fields(fld)

这是我的代码:

CurrentDb.Execute "DELETE * FROM " & appendTo_text.Value & ";", dbFailOnError
Set db = CurrentDb()
Dim fld As DAO.Field
Set rs1 = db.OpenRecordset(tableName_text.Value)
Set rs2 = db.OpenRecordset(appendTo_text.Value)
For Each fld In rs1.Fields
  rs2.AddNew
  rs2.Fields(fld) = rs1.Fields(fld)
  rs2.Update
Next

Set fld = Nothing
rs1.Close
rs2.Close

1 个答案:

答案 0 :(得分:2)

你在所有行中循环的部分在哪里?另外,您要为每个字段添加一个新行,而不是为每一行添加一行。最后,问题是循环中的fld是一个对象,当被视为字符串时将隐式转换,返回默认属性Value。因此,您尝试通过其他记录集中的字段选择字段 - 您应该使用其他记录集中的字段名称

Do While Not SourceRecordset.Eof
   TargetRecordset.AddNew
   For Each Field In SourceRecordset.Fields
      TargetRecordset.Fields(Field.Name).Value = Field.Value
   Next
   TargetRecordset.Update
Loop

另外,您能不能为变量rs1rs2命名吗?至少将它们命名为SourceRecordsetTargetRecordset。你不希望开发人员在你身后醒来,在晚上睡不着觉,想要狩猎你并为你做坏事。

如果您要执行大量行,您可能还需要查看UpdateBatch以及如何断开记录集,以便您获得不错的性能。

最后,如果您仍然遇到性能问题,请认识到语法Recordset.Fields(Field.Name).Value 。 (如果您使用的是ADODB,最快的方法是直接在AddNew方法中传递值数组)。但是,您仍然可以通过获取对每个字段的引用来获得速度提升,如下所示:

Dim SourceOrderID As DAO.Field
Set SourceOrderID = SourceRecordset.Fields("OrderID")
Dim TargetOrderID As DAO.Field
Set TargetOrderID = TargetRecordset.Fields("OrderID")

然后,不要在For Each循环中使用Do While,只需指定:

TargetOrderID.Value = SourceOrderID.Value
TargetOrderDate.Value = SourceOrderDate.Value

我保证会更快。

此外,如果您正在寻求速度改进,如果您使用了With,就像在DAO的Microsoft文档中在线中找到的示例一样,请在没有With的情况下尝试使用它来查看它是否更快。< / p>