IDENTITY_INSERT问题设置为OFF? : - /

时间:2011-07-11 04:57:16

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

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

  

当IDENTITY_INSERT设置为OFF时,无法在表'Orders'中为identity列插入显式值。

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

我有:

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

所以,正如你所看到的,它非常简单。但是,为什么它不起作用?

我的表定义是:

Table Definition

6 个答案:

答案 0 :(得分:11)

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

启用标识插入 简要 ,或者:不要尝试插入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,你仍然会遇到同样的问题。

答案 1 :(得分:3)

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

与Marc Gravell的回答一样,您可以使用

启用身份插入
SET IDENTITY_INSERT [ database. [ owner. ] ] { table } { ON | OFF }

但是在常规应用程序代码中执行此操作实际上是不健康的 - 您最终会遇到并发问题并且很可能会重复身份。更好的是,不要插入订单ID - 让数据库自动为您执行,然后使用@@IDENTITY(或更好,SCOPE_IDENTITY())查询新ID。

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

答案 2 :(得分:2)

您不希望UserID成为Identity,我也不认为您希望UserID成为主键。您可能希望OrderID成为主键,或者最好使用userid和orderid共享主键。

答案 3 :(得分:1)

在您的表格定义中将Is Identity?设置为False,但没有设置您无法手动将值插入UserID

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

有趣的是,我发现当我使用"从包含数据的表格中选择.....进入[新表]时创建一个表"我随后无法插入新记录,将Insert_Identity设置为off消息。 我通过删除表然后使用Create Table脚本重建它来解决这个问题,现在可以根据需要插入尽可能多的新ID