【问题标题】:Problems with IDENTITY_INSERT Set to OFF? :-/IDENTITY_INSERT 设置为 OFF 的问题? :-/
【发布时间】:2011-10-02 12:28:59
【问题描述】:

我正在尝试将订单详细信息插入我的数据库,但它一直在说:

当 IDENTITY_INSERT 设置为 OFF 时,无法为表“订单”中的标识列插入显式值。

我要做的只是将用户 UserId 插入到 UserId 列中,使用 WebSecurity.CurrentUserId - 为什么这不起作用?

我有:

dbase.Execute("INSERT INTO Orders 
                 (UserId, OrderId, Status) 
               VALUES 
                 (@0, @1, @2)", 
               WebSecurity.CurrentUserId, 
               Session["OSFOID"], 
               "Confirmed");`

所以,如您所见,它非常简单。但是,为什么它不起作用?

我的表定义是:

【问题讨论】:

  • 系统确实允许回头客。 orders 表仅用于临时存储信息。
  • 抱歉,这个数据模型对我来说意义不大......
  • 此数据模型基于他拥有的客户现有的 Access 数据库。很抱歉这没有任何意义,我知道它需要改变,但这不是他现在愿意改变的事情,因为他“太忙”了其他工作。
  • 其实,因为我大部分时间都无聊得要死,我想如果他允许我的话,我可能会考虑自己改变它。
  • @OMG - 无需抱歉。 :) 感谢您在这几个月里给予我的所有帮助

标签: c# asp.net sql sql-server identity


【解决方案1】:

除非您启用进行身份插入的能力(通过为该表设置身份插入on),否则不允许触摸该列 - 数据库拥有它。

要么启用身份插入简要,要么:不要尝试插入 UserId(让数据库创建一个新 id)。

根据在线书籍,SET IDENTITY_INSERT

SET IDENTITY_INSERT Orders ON
INSERT INTO Orders (UserId, OrderId, Status) VALUES (@0, @1, @2)
SET IDENTITY_INSERT Orders OFF

但更有可能的是:如果这是 Orders 表,那么标识不应该在 OrderId 上吗?当然,由于您试图控制OrderId,您仍然会遇到同样的问题。

【讨论】:

  • 我明白这一点。但是,我还有另一个具有相同定义的表。我可以插入没有问题。
  • 我没有创建新的 ID。我正在插入一个现有的。
  • @jase - 不,你没有。这显然不是同一个定义,否则你会得到同样的错误。一定有区别。
  • @jase - 就 that table 而言,它不关心该数字是否存在于其他地方。重新“具有相同定义的另一个表” - 然后要么该表没有IDENTITY,或者您已经在该表上启用了IDENTITY_INSERT
  • @jase - 如果您要插入现有 ID,则不应将该列定义为身份字段。 Identity 字段会自动生成其 ID,并且(通常)不允许插入。
【解决方案2】:

通常您不希望将整数插入主键列。通常,只有在您希望 SQL Server 在插入时将自动递增整数设置到该列中时,您才会将该列的“标识”标志设置为 true。

与 Marc Gravell 的回答一样,您可以使用启用身份插入

SET IDENTITY_INSERT [ database. [ owner. ] ] { table } { ON | OFF }

但是在常规应用程序代码中这样做确实很不健康——您最终会遇到并发问题并且很可能会出现重复身份。更好的是,不要插入订单的 ID - 让数据库自动为您完成,然后只需使用 @@IDENTITY(或者更好,SCOPE_IDENTITY())查询新 ID。

如果出于某种原因您确实需要存储用户的会话 ID,请将其设置为 order 表中的单独列,或者更好的是,在单独的 User 表中,UserId 是外键。

【讨论】:

    【解决方案3】:

    您不希望 UserID 成为身份,我也不认为您希望 UserID 成为主键。您很可能希望 OrderID 成为主键,或者最多与 userid 和 orderid 共享主键。

    【讨论】:

      【解决方案4】:

      在您的表定义中将Is Identity? 设置为False,没有设置您不能手动向UserID 插入值

      【讨论】:

      • 可以,并且错误信息已经告诉你如何...更改IDENTITY不可掉以轻心-当然目前完全有可能是错误(但这与盲目删除它不同)
      【解决方案5】:

      您已将 IS Identity 设置为 YES,这就是为什么现在您无法为此列插入值 DB 将通过递增值自动插入它..

      我看到你将 UserId 设置为表的主键是错误的 Order OoderID 应该是列的主键。

      将 UserID IsIdentify 设置为 false 并将 OrderID IsEdentitfy 设置为 yes 并将其设为主键列。

      【讨论】:

        【解决方案6】:

        有趣的是,我发现当我使用“Select.....Into [new table] from [tables contains data]”创建表时,我随后无法插入新记录,将 Insert_Identity 设置为 off 消息。 我通过删除表然后使用创建表脚本来重建它来解决这个问题,现在根据需要插入尽可能多的新 ID 没有问题

        【讨论】:

          猜你喜欢
          • 2010-10-01
          • 2013-06-09
          • 1970-01-01
          • 1970-01-01
          • 2021-08-27
          • 2015-10-18
          • 1970-01-01
          • 2018-05-27
          • 2012-04-24
          相关资源
          最近更新 更多