IDENTITY_INSERT设置为OFF时出现问题? :-/

6

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

当IDENTITY_INSERT被设置为OFF时,在表“Orders”中无法为标识列插入显式值。

我只是想通过使用WebSecurity.CurrentUserId将用户的UserId简单地插入到UserId列中,为什么这不起作用?

我已经:

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

所以,正如你所看到的,这很简单。但是为什么它不能工作呢?

我的表定义如下:

表定义


系统允许重复客户。订单表仅用于临时存储信息。 - bendr
1
抱歉,这个数据模型对我来说不太合理... - OMG Ponies
这个数据模型是基于客户现有的Access数据库。很抱歉它没有任何意义,我知道它需要被改变,但他现在不愿意改变,因为他在忙于其他工作事务。 - bendr
实际上,由于大部分时间我都很无聊,如果他允许的话,我想我可以考虑自己来改变这种情况。 - bendr
@OMG - 不用道歉。 :) 我非常感激你在过去几个月里给我的所有帮助。 - bendr
6个回答

12

除非您启用了identity-insert功能(通过为该表设置identity-insert on),否则您不允许触及该列 - 该数据库拥有它。

要么暂时启用identity insert,要么:不要尝试插入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,因此仍将面临相同的问题。


我理解这一点。但是,我还有另一个具有相同定义的表格。我可以毫无问题地插入其中。 - bendr
我不是在创建新的ID,而是插入一个已经存在的。 - bendr
2
@jase - 不,你不需要。很明显它们的定义不同,否则你就会得到相同的错误。一定有所区别。 - Erik Funkenbusch
1
@jase - 就那个表而言,它并不关心该数字是否存在于其他地方。关于“具有相同定义的另一个表”- 那么要么该表没有IDENTITY,要么您已经在该表上启用了IDENTITY_INSERT - Marc Gravell
1
@jase - 如果您正在插入现有的ID,则该列不应定义为标识字段。标识字段会自动生成其ID,并且通常不允许插入。 - Erik Funkenbusch

3

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

与Marc Gravell的答案一样,您可以使用以下方式启用identity insert:

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

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

如果由于某种原因您确实需要存储用户的会话ID,请将其作为订单表上的单独列,或者更好地,作为单独的用户表上的列,其中UserId是外键。


2

您不希望UserID成为Identity,我也认为您不想让UserID成为主键。很可能,您希望OrderID成为主键,或者最好是与UserID和OrderID共享主键。


1
在您的表定义中将Is Identity?设置为False,如果不设置,则无法手动插入UserID的值。

1
可以这样做,错误信息已经告诉了你如何...更改“IDENTITY”并不是轻而易举的事情 - 当然,目前完全有可能是错误的(但这与盲目删除它不同) - Marc Gravell

1

您已将IS Identity设置为YES,因此现在无法为此列插入值,数据库将通过递增值自动插入它。

我看到您将UserId设置为表的主键,这是错误的,OrderID应该是列的主键。

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


0
有趣的是,我发现当我使用“Select.....Into [新表] from [包含数据的表]”创建表后,随后无法插入新记录,出现了Insert_Identity关闭的消息。 我通过删除表,然后使用Create Table脚本重新构建它来解决了这个问题,现在可以插入任意数量的新ID。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接