从Access中的表中删除记录

时间:2017-04-05 21:17:10

标签: sql vba ms-access access-vba

我正在使用Access数据库中的两个表 Mitigations 新控件ID Mitigations 表有一个表单。作为该表单的一部分,可以将控件 ID 添加到新控件ID 表中。我的代码工作得很好。我正在尝试通过 Mitigations 表单添加从新控件ID 表中删除记录的功能。

用户将在 Text55 中输入一个字符串,在更新该字段后,应删除新控制ID 表中的相应记录。

以下是我的代码:

Private Sub Text55_AfterUpdate()

'removing record with Archer Control ID from New Control IDs table
Dim dbNewInitiatives As DAO.Database
Dim rstMitigations As DAO.Recordset
Dim strSQL As String

    Set dbNewInitiatives = CurrentDb
    strSQL = "SELECT * FROM [New Control IDs] WHERE ([Mitigation ID] = " & Me.[Mitigation ID].Value & ") AND ([Archer Control ID] = '" & Me.[Text55].Value & "') ORDER BY [ID]"
    Set rstMitigations = dbNewInitiatives.OpenRecordset(strSQL, dbOpenDynaset)

    Do While Not rstMitigations.EOF
        rstMitigations.Delete
        rstMitigations.MoveNext
    Loop

rstMitigations.Close

Set rstMitigations = Nothing
Set dbNewInitiatives = Nothing

End Sub

上述代码成功找到符合条件的新控制ID 表中的所有记录并删除它们。谢谢!

2 个答案:

答案 0 :(得分:2)

考虑使用Database.Execute方法运行DELETE操作查询,而无需DAO记录集:

Set dbNewInitiatives = CurrentDb
strSQL = "DELETE FROM [New Control IDs]" _
           & " WHERE ([Mitigation ID] = " & Me.[Mitigation ID].Value & ")" _
           & " AND ([Control ID] = '" & Me.[Text55].Value & "')"

dbNewInitiatives.Execute strSQL, dbFailOnError

答案 1 :(得分:0)

绝对考虑Parfait的答案,但首先要了解问题是什么总是好的。对我而言,循环中的逻辑看起来可能不正确。

除非您提供更多详细信息,否则我将首先假设[新控制ID]。[ID]是该表上的唯一键。如果是这种情况,那么您将该唯一ID存储在变量strID中,然后在实际尝试删除记录之前移动到下一条记录。在这种情况下,循环中的If语句将始终为false ,因为当前记录的[ID]不等于先前记录的[ID]值。

...
Do While Not rstMitigations.EOF
    '* This compares the previous row's [ID] with the current row's [ID]  '
    If rstMitigations![ID] = strID Then
        rstMitigations.Delete
...

如果[ID]值不唯一,那么您的代码只会删除与一系列相同[ID]值中的第一行匹配的后续行。它会使每个唯一[ID]值的第一行保持不变(即未删除)。如果只有一个特定的[ID]值,则永远不会删除该行。这就是你想要的吗?

请注意,Parfait的操作查询将删除SELECT查询返回的所有相同记录。只是为了记录,要使用记录集完成此操作,只需将其简化为

即可
....
Set dbNewInitiatives = CurrentDb
strSQL = "SELECT * FROM [New Control IDs] WHERE ([Mitigation ID] = " _
        & Me.[Mitigation ID].Value & ") AND ([Control ID] = " _
        & Me.[Text55].Value & ") ORDER BY [ID]"
Set rstMitigations = dbNewInitiatives.OpenRecordset(strSQL, dbOpenDynaset)

Do While Not rstMitigations.EOF
    rstMitigations.Delete
    rstMitigations.MoveNext
Loop
....