我不太清楚为什么这不起作用。调试给我一个错误:
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
答案 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
另外,您能不能为变量rs1
和rs2
命名吗?至少将它们命名为SourceRecordset
和TargetRecordset
。你不希望开发人员在你身后醒来,在晚上睡不着觉,想要狩猎你并为你做坏事。
如果您要执行大量行,您可能还需要查看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>