循环访问 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 中的两个记录集并更新条目的主要内容,如果未能解决你的问题,请参考以下文章