由于密钥违反VBA SQL Access,UPDATE失败

时间:2014-01-28 11:35:06

标签: sql vba ms-access sql-update access-vba

我需要帮助

我有一个MS Access数据库表单,它将使用户能够编辑项目的详细信息,并且在单击保存按钮时输入的新值将保存到数据库表中我使用sql UPDATE语法执行此操作和我的代码类似于下面的

Private Sub Save_Click()

ltemp = " UPDATE Table1 "
ltemp = ltemp & " SET ClientName  = 'ANN' "
ltemp = ltemp & " WHERE ProjectID = 2333 "
CurrentDb.Execute (ltemp)

End Sub 

使用此代码,没有任何反应。代码执行时没有错误,但表中的值不会改变 我尝试了代码

DoCmd.RunSQL " UPDATE Table1 SET ClientName = 'ANN'  WHERE ProjectID = 2333"

有了这个,我收到一条很长的错误信息,表明由于密钥违规而无法更新记录。问题是字段'ClientName'不是主键,尽管它(在关系中)链接到另一个表的主键。

这两个代码都可以更新除了与另一个表的主键关系的其他字段。

2 个答案:

答案 0 :(得分:2)

显然,“客户”表中没有带有“ANN”ID的记录,因此无法将其设置为更新表中相应\外键字段的有效值。

currentDb.execute指令不会返回任何错误消息(不像'DoCommand'那样)因为它不应该,只要语法正确(见下文)。您可以尝试使用currentDb.RecordsAffected来检查您的指令是否更改了任何记录。检查执行方法可用的参数以获取更多详细信息。

访问帮助:

“在Microsoft Jet工作区中,如果您提供语法正确的SQL语句并具有相应的权限,则Execute方法不会失败 - 即使不能修改或删除单行因此,在使用Execute方法运行更新或删除查询时,始终使用dbFailOnError选项。如果受影响的任何记录被锁定且无法更新,则此选项会生成运行时错误并回滚所有成功的更改。删除。”

答案 1 :(得分:1)

您试图违反在数据库中设置的参照完整性。

正如您所指出的,还有另一张表,看起来像这样:

CREATE TABLE Client
(
    ClientName VARCHAR(100),
    ... other client fields here
);

FOREIGN KEYTable1.ClientName之间设置了Client.ClientName

要避免这种情况,请:

  • 将名称为ANN的客户端插入另一个表
  • 如果您打算违反约束,请在Table1.ClientName上删除外键约束(但请注意,当客户端丢失时,联接可能会失败)
  • 更改设计并开始使用代理键,例如ClientID并引用其他表格中的代理键(而不是客户名称等“自然”键)。通过这种方式,客户可以结婚,更改姓名等,您的数据库也不会破坏:)