循环访问 Access 中的两个记录集并更新条目

Posted

技术标签:

【中文标题】循环访问 Access 中的两个记录集并更新条目【英文标题】:Looping through two recordsets in Access and updating entries 【发布时间】:2014-03-21 15:35:14 【问题描述】:

我的数据库中有两个名为 Book 和 ReferencesNum 的表,它们具有一对多的关系,其中 Book 是主表。我想遍历这两个记录,并且当 Book 中的主键(标题)等于 ReferencesNum 中具有相同标题的记录时,我想从 Book 中的记录中获取 ID 号并将相同的值放入ReferencesNum 中的 ID 字段。

我想通过使用 SQL 语句来做到这一点。我为 VBA 获得了它,但我正在尝试使用 SQL 语句。

VBA 代码:

Sub GoThroughX()

Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset

Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Book")
Set rs2 = db.OpenRecordset("ReferencesNum")

  rs1.MoveFirst
  Do Until rs1.EOF
    rs2.MoveFirst
     Do Until rs2.EOF
       If rs1![Title] = rs2![Title] Then
         rs2.Edit
         rs2![ID] = rs1![ID]
         rs2.Update
       End If
      rs2.MoveNext
    Loop
 rs1.MoveNext
 Loop

rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing
Set db = Nothing

MsgBox "Done"

End Sub

使用 SQL:

Sub UpdateX1()

Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset

Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Book")
Set rs2 = db.OpenRecordset("ReferencesNum")

rs2.MoveFirst

 Do Until rs2.EOF

    SQLstr = "UPDATE ReferencesDoc " & _
             "SET ID = rs1![ID] " & _
             "WHERE [Title] = rs1![Title];"
    DoCmd.RunSQL SQLstr

 rs2.MoveNext
 Loop

 MsgBox "Done"

 End Sub

带有 SQL 的代码可以工作,但它不断提示一个框,我必须在其中输入 ID 和标题,然后它会更改 ID 值。

我怎样才能让它停止询问 ID 和 Title 值,而只是通过它自己的表,就像 VBA 代码一样。

提前致谢。

【问题讨论】:

【参考方案1】:

您需要重新评估您的设计。你为什么首先使用记录集?

您正在创建一个 O(N^2) 流程,您可以通过使用单个 SQL 语句来更新所有记录,以 O(1) 的方式完成此操作。如果您打算使用 DAO,请查看 DAO.QueryDef 对象而不是 DAO.Recordset 对象来完成 SQL 解决方案。

不过,在回答您的上述问题时,您会收到提示,因为您在引用记录集中的字段时使用了错误的语法,因此 Access 认为您想要提供一个参数。已经很长时间了,但我相信正确的语法是 rst.("fieldName") 或使用 rst.fields("fieldName") 来引用记录集中的列。

但实际上,您想远离这里的记录集。

【讨论】:

【参考方案2】:

考虑解决方案,将访问警告设置为 off : 最好的问候

'With SQL:

Sub UpdateX1()

Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset

Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Tabl1")
Set rs2 = db.OpenRecordset("Tabl2")


'dans un tel cas, ne pas oublier de régler les warnings à false
DoCmd.SetWarnings False
rs1.MoveFirst
Do Until rs1.EOF

rs2.MoveFirst

 Do Until rs2.EOF

    sqlstr = "UPDATE Tabl2 " & _
             "SET fld2 = '" & rs1![fld2] & "'" & _
             "WHERE [fld1] = '" & rs1![fld1] & "';"
    DoCmd.RunSQL sqlstr

 rs2.MoveNext
 Loop
 rs1.MoveNext
Loop
DoCmd.SetWarnings True

rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing
Set db = Nothing

 MsgBox "Done"

End Sub

'使用 SQL: '考虑限制记录数, '在你的记录集 1 和你的记录集 2 之间 '以这种方式更新,因为仍然在运行 '很长时间 '现在,你可以写更多的泛型了!!! '祝你好运!

Sub UpdateX2()

Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset

Dim strSQL1 As String
Dim strSQL2 As String


strSQL1 = "SELECT Top 10 fld1, fld2 FROM Tabl1;"


Set db = CurrentDb()
Set rs1 = db.OpenRecordset(strSQL1, dbOpenSnapshot)
Set rs2 = db.OpenRecordset("Tabl2")


'dans un tel cas, ne pas oublier de régler les warnings à false
DoCmd.SetWarnings False
rs1.MoveFirst
Do Until rs1.EOF

rs2.MoveFirst

 Do Until rs2.EOF

    sqlstr2 = "UPDATE Tabl2 " & _
             "SET fld2 = '" & rs1![fld2] & "'" & _
             "WHERE [fld1] = '" & rs1![fld1] & "';"
    DoCmd.RunSQL sqlstr2

 rs2.MoveNext
 Loop
 rs1.MoveNext
Loop
DoCmd.SetWarnings True

rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing
Set db = Nothing

 MsgBox "Done"

End Sub

【讨论】:

以上是关于循环访问 Access 中的两个记录集并更新条目的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 数据表子表单中导航和更新

Access 2016 VBA .FindFirst 在记录集中找不到记录

循环访问 MS Access 中的连续记录

循环访问 MS Access 中的子记录

apache访问记录太多访问条目

访问 VBA。检测记录集条目是不是会溢出