Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何使用c防止Access数据库中的重复条目?_Database_Ms Access - Fatal编程技术网

Database 如何使用c防止Access数据库中的重复条目?

Database 如何使用c防止Access数据库中的重复条目?,database,ms-access,Database,Ms Access,我有一个MS Access表,其中包含一列和多行。保存到此表中的文本框的值。我想防止提交重复的条目。例如,如果我在文本框中键入ankush,并且该条目已经存在于表中,那么我希望显示一个msgbox,表明该条目已经存在于表中。使用c可以在列上创建唯一的键。如果字段不是主键字段,则可以在包含“ankush”的字段上设置索引并使该索引唯一 [Index=Yes(no duplicates)] 然后Jet DB引擎将不允许插入,并将显示一条默认消息 我使用的是较旧版本的Access,因此您的里程数可能

我有一个MS Access表,其中包含一列和多行。保存到此表中的文本框的值。我想防止提交重复的条目。例如,如果我在文本框中键入ankush,并且该条目已经存在于表中,那么我希望显示一个msgbox,表明该条目已经存在于表中。使用c可以在列上创建唯一的键。

如果字段不是主键字段,则可以在包含“ankush”的字段上设置索引并使该索引唯一

[Index=Yes(no duplicates)]
然后Jet DB引擎将不允许插入,并将显示一条默认消息

我使用的是较旧版本的Access,因此您的里程数可能会有所不同,但要显示自定义错误消息,您必须首先查询表中的值,如下所示:

SELECT COUNT(MyField)as violated FROM MyTable WHERE MyField = 'input value here'

如果违反了>0,请在代码中分支以显示您的消息框。

问题的焦点已完全改变,导致答案过时。

只需添加@Gary.Ray建议的内容:如果您的表有多个候选键,如果字段不是主键。。。然后,ACE/Jet引擎返回的故障消息没有告诉您违反了哪个密钥:

您请求对表进行的更改 他们没有成功,因为他们会 在索引中创建重复的值, 主键或关系。改变 字段中的数据 如果包含重复数据,请删除 索引,或重新定义索引以允许 请复制条目并重试

幸运的是,实现键的方法不止一种,使用CHECK约束的优点是在失败消息中返回约束的名称。例如,此检查约束将防止列“MyField”重复:

ALTER TABLE MyTable ADD
   CONSTRAINT MyTable__MyField__no_dups_allowed 
      CHECK (NOT EXISTS (
                         SELECT T1.MyField 
                           FROM MyTable AS T1
                          GROUP
                             BY T1.MyField 
                         HAVING COUNT(*) > 1
                        ));
对于未通过“MyField”但满足表中其他键的数据,失败消息为:

禁止使用一个或多个值 验证规则 '我的表格\我的字段\不允许重复' 设置为“MyTable”。输入一个 此字段的表达式可以是 接受


然后,您可以捕获C前端中的错误,并分析已知约束名称的错误消息,以提供更有意义的消息。

使用C添加更改了整个问题的焦点。这并不意味着您不应该在后端表中仍然具有适当的唯一索引,不过。@David W.Fenton:如果你说的是唯一约束,那么我会同意:你不必在ACE/Jet中使用索引来实现唯一约束。在这个帖子里看到我的答案。
If [field name] = Me. field name in the form.Column(0) And Not Me.NewRecord Then
Me.field name in the form.Undo
Me.Undo
Exit Sub
End If

If [field name] = Me. field name in the form.Column(0) And Me.NewRecord Then
Me.field name in the form.Undo
Me.Undo
MsgBox " already there", vbInformation, "repeated"
Exit Sub
End If