【问题标题】:Why does MS Access 2007 not allow a row insert, but then allow it on the next insert attempt?为什么 MS Access 2007 不允许行插入,但在下一次插入尝试时允许它?
【发布时间】:2011-07-10 17:20:21
【问题描述】:

我的插入语句是:

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

...所有值的格式都正确。该表具有上述字段和另一个,一个 long 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)

【问题讨论】:

  • 要使链接可读,您应该使用 SO 标记而不是 html 来显示链接等。
  • 我不太了解 Access,但是如果您有一个触发器,该触发器会在每次插入时插入一个额外的行,并为自动增量键提供一个显式值,那么这可能会发生在某些数据库中。调查这些可能性,并将表的结构与任何相关内容一起发布,并在插入之前和插入之后选择最大的主键并将它们也粘贴到此处。
  • 第三次/第四次处决会发生什么?是只有第一次执行失败还是每秒一次?
  • @Whatsit - 只有第一次。
  • @Richard aka cyberkiwi:如果您说“Access2007 没有触发器”,那么我就不会指责您宣传无知;)

标签: c# sql insert ms-access-2007 key


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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


    你能用 accessed_on 数据类型和 Now 数据类型

    检查一下吗



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

    谢谢
    收费

    【讨论】:

    • 建议将日期更改为插入字符串的意义何在?这意味着您没有得到值的验证。此外,您将 Now() 函数传递给 Jet/ACE 进行处理。如果查询需要很长时间,我不完全确定 Jet/ACE 如何处理它。它是否被评估一次,以便所有记录都获得相同的日期/时间值?还是逐行评估,以使它们不完全相同?我建议获取值并连接文字值以发送到 Jet/ACE 进行插入。
    • 无论如何,insert语句中的accessed_on列是不必要的,因为数据库中有一个默认值。
    【解决方案3】:

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

    而且我使用的是 ACE 版本,语法无法正常工作。 需要寻找其他方式直接实现语法。

    【讨论】:

    • @Tim 在评论中指出 Now() 是该字段的默认值,因此该字段可以完全从 SQL 语句中省略。
    【解决方案4】:

    众所周知,MS-Access 会吐出与他们报告的问题无关的虚假错误。用括号 [type] 将名为“type”的列括起来不会有什么坏处。

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

    【讨论】:

      【解决方案5】:

      在这里回顾一些旧记忆......

      尝试在您的表中放置一个时间戳字段。

      我不记得确切的原因 - 这与 Access 难以识别记录/可能是某种锁定或索引怪癖有关。几年前,当它发生在我的一张桌子上时,我对此进行了一些研究。

      错误所指的键违规不是另一个表中的缺失键,而是同一个表中的重复键。有时,Access 会遇到麻烦,并认为它分配给新记录的键已经分配给表中的另一条记录。我不知道是什么原因导致这种情况发生。但是通过在表中放置一个时间戳字段,它会导致 Access 以不同的方式思考。

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

      【讨论】:

      • 时间戳通常只与在 Access 中编辑绑定表单中的数据相关,因为这允许 Access 在其他用户更新时刷新显示的数据。 PK 和 Timestamp 是它顺利运行的必要条件,我顺理成章地在每个 SQL Server 表中添加了一个时间戳字段。用于 Access 的 SQL Server 迁移助手也做同样的事情,即当它升迁您的 Access 数据表时,它会在 SQL Server 版本中为所有这些表添加一个时间戳字段。
      • 时间戳也与密钥生成有关。不应该是这种情况,但它确实强制 Access 停止生成密钥违规错误。根据我在回答中提到的经验,它与绑定形式无关。
      • 我从来没有真正有机会测试时间戳修复,但后来我确实在另一个数据库中遇到了这个问题。接受您的回答,因为您提到访问“让电线越过”。似乎正是这里发生的事情。压缩和修复数据库也可以解决这个问题。
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-24
        • 2020-02-07
        • 2020-01-17
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        相关资源
        最近更新 更多