尝试使用表单中的更新字符串时出现密钥冲突错误

时间:2013-12-11 18:45:33

标签: vba ms-access ms-access-2007 access-vba

我有一个允许人们添加新员工的表单,但他们也需要能够编辑或更新现有员工。

所以我添加了一个按钮,允许他们在表单上进行更改,单击更新按钮,他们正在处理的记录会立即更新。

当我测试它时,字符串会运行,甚至会弹出一个警告,告诉您即将永久更改记录。但随后它抛出一个错误,指出“由于密钥违规而没有更新记录”

我已加入“点击”事件代码

DoCmd.RunSQL "UPDATE EntList " & _
    "SET EntList.BusinessUnit = '" & Me.cboBUnit & "', EntList.EntityName = '" & Me.txtEntName & "', EntList.Position = '" & Me.txtPos & "', EntList.Location = '" & Me.cboLoc & "', EntList.Client = '" & Me.cboClient & "', EntList.Dept = '" & Me.cboDept & "', EntList.DistKey = '" & Me.txtDistKey & "', EntList.Salary = '" & Me.txtSalary & "', Entlist.Currency = '" & Me.cboCurrency & "', EntList.[SG&A] = '" & Me.txtSG_A & "', EntList.BillRate = '" & Me.txtBillRate & "', EntList.[Util%] = '" & Me.txtUtil_ & "', EntList.MeritDate = '" & Me.txtMeritDate & "', EntList.[Merit%] = '" & Me.txtMerit_ & "' " & _
    "WHERE EntList.EntityID = '" & Me.txtEntID.Value & "';"

我想知道我错过了什么导致了这个错误。

1 个答案:

答案 0 :(得分:1)

如果我正确地遵循了注释,您已经解决了由于其中一个更新值不满足强制参照完整性的已定义关系的要求而发生的密钥违例错误。在这种情况下,Access会将关系违规报告为严重违规行为。

并且,解决了该问题后,您现在面临更新值与目标字段之间的类型不匹配。

您的UPDATE包含了它提供的每个值的引号。可能当前错误是因为目标字段是数字数据类型而不是文本。

因此,您可以检查每个目标字段的数据类型,并确保UPDATE包含围绕文本字段值的引号,#围绕日期/时间字段的值,并且没有分隔符数字字段的值。

虽然这是可能的,但它也很耗时且容易出错。更好的方法是使用参数查询,这样您就不必使用分隔符。

以下是我建议的方法的简略示例。你必须扩展它以包括我遗漏的其他字段。

Dim strUpdate As String
Dim db As DAO.Database
Dim qdf As DAO.QueryDef

strUpdate = "UPDATE EntList AS e" & vbCrlf & _
    "SET e.BusinessUnit = pBusinessUnit, " & _
    "e.EntityName = pEntityName" & vbCrLf & _
    "WHERE e.EntityID = pEntityID;"
Debug.Print strUpdate

Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strUpdate)
qdf.Parameters("pBusinessUnit") = Me.cboBUnit.Value
qdf.Parameters("pEntityName") = Me.txtEntName.Value
qdf.Parameters("pEntityID") = Me.txtEntID.Value 
qdf.Execute dbFailOnError
Set qdf = Nothing
Set db = Nothing