为什么MS Access 2007不允许插入行,但是在下次插入尝试时允许它?

我的插入声明是:

INSERT INTO myTable (inst_id,user_id,app_id,type,accessed_on) VALUES (3264,2580,'MyApp','Renew',Now); 

…所有值格式正确的地方。 该表具有上述字段和另一个,长int自动增量键字段。 外键是’inst_id’,’user_id’和’app_id’。

我从Access收到此错误: 访问错误

…以及错误输出时VS 2005中的以下错误:

System.Data.OleDb.OleDbException:您向表请求的更改未成功,因为它们将在索引,主键或关系中创建重复值。 更改包含重复数据的字段或字段中的数据,删除索引或重新定义索引以允许重复条目,然后重试。

在进行此插入查询时,我可以查看数据库并查看每个外键值是否存在于各自的表中并且已经持续数月(对于我正在使用的特定示例)。 这些字段也设置为我可以有重复,所以这不是问题。 在其他表格中这种性质的呼叫效果很好。 我不需要在插入查询中提供自动增量键值,它会自动为我添加(就像它应该)。

奇怪的是,如果我在我的代码中执行此操作:

 try { //Execute the query here... } catch { //Execute the same query again } 

…或者如果我只是尝试在Access中执行两次,它就可以了。

有没有人遇到过这个? 同样,这种类型的插入适用于其他表,所有外键都存在于它们各自的表中,该表的主键设置为’自动增量’,并且所有字段(当然不是主键字段)是设置为允许重复。

有任何想法吗?

编辑:插入前最大的键: 343085 。 插入后最大的密钥: 343086 。 格式为:

 id: AutoNumber (Field Size=Long Interger, New Values=Increment, Indexed=Yes - No Duplicates) inst_id: Number (Field Size=Long Interger, Required=Yes, Indexed=Yes - Duplicates OK) user_id: Number (Field Size=Long Interger, Required=Yes, Indexed=Yes - Duplicates OK) app_id: Text (Field Size=255, Required=Yes, Indexed=Yes - Duplicates OK) type: Text (Field Size=50, Required=Yes, Indexed=No) accessed_on: Date/Time (Default Value=Now(), Required=Yes, Indexed=No) 

这里有一些旧记忆…

尝试在表中添加时间戳字段。

我不记得究竟为什么这样做 – 与Access有关,难以识别记录/可能是某种锁定或索引怪癖。 几年前,当我的一张桌子发生时,我做了一些研究。

错误引用的密钥违规不是另一个表中缺少的密钥,它是同一个表中的重复密钥。 有时,Access会将它的线交叉并认为它分配给新记录的密钥已经分配给表中的另一条记录。 我不知道是什么原因导致的。 但是通过在表中放置一个时间戳字段,它会导致Access以不同的方式思考。

这是一个令人沮丧的修复,因为我不知道为什么它的工作原理。 现在我的表中有一个无用的时间戳字段。 但就是这样吧。

众所周知,MS-Access可以防止与他们报告的问题无关的虚假错误。 用括号[type]包围名为“type”的列不会有什么坏处。

http://office.microsoft.com/en-us/access-help/access-2007-reserved-words-and-symbols-HA010030643.aspx#_Toc272229038

值是否在尝试之间发生变化,以便现在不再出现重复键错误?

INSERT INTO myTable(inst_id,user_id,app_id,type,accessible_on)VALUES(3264,2580,’MyApp’,’Renew’,Now);

你能用access_on数据类型和Now数据类型来检查这个吗?

在插入时将DateTime的值类型更改为String将是好的。
如果这对您有用,请告诉我。

谢谢
rAfee

我相信Jet / ACE不会理解NOW()方法。

我使用ACE版本,语法无法正常工作。 需要找到直接实现语法的另一种方法。

我知道很久以前我有一个类似的问题。 在我的情况下,我得到了相同的错误,但我没有在表中的任何唯一索引。 我终于通过修复和压缩数据库来解决它。