我正在尝试将订单详细信息插入到我的数据库中,它一直在说:
当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");`
所以,正如你所看到的,它非常简单。但是,为什么它不起作用?
我的表定义是:
答案 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