【问题标题】:IDENTITY_INSERT is set to OFF(can't find where is the error) [duplicate]IDENTITY_INSERT 设置为 OFF(找不到错误在哪里)[重复]
【发布时间】:2017-12-05 11:36:37
【问题描述】:

我正在尝试在 Visual Studio 2015 中运行我的程序。我在其中创建了一个 .mdf 数据库和一个表。当我尝试运行它时,我收到以下错误:

cannot insert explicit value for identity column in table tblinfo when IDENTITY_INSERT is set to OFF".

希望有人可以帮助我。谢谢。

【问题讨论】:

  • 您不能插入到已定义为IDENTITY 列的列中。这样做的全部意义在于让服务器为您创造价值。
  • @ShiranDror 不过,这只是解决问题的方法,最好让数据库来创造价值。
  • @KarmaKid,请在可能的地方发布代码,而不是图片
  • @DavidG 将 IDENTITY_INSERT 设置为 ON 不是黑客,而是一种选择。我已经多次使用它来将数据从旧数据库移动到新数据库
  • @ShiranDror 和我一样,但在这种情况下,让代码正常工作将是一个黑客行为。相反,OP 应该修复代码以不尝试插入该值。

标签: c#


【解决方案1】:

“SET IDENTITY_INSERT”的范围仅基于连接。对于新连接,它将被重置。

这里,如果要将数据插入标识列,则必须在插入语句之前先在存储过程中设置SET IDENTITY_INSERT ON。再次插入数据后,将其设置为 ON。在插入语句之后设置 IDENTITY_INSERT OFF。

【讨论】:

  • 正如上面的 cmets 所指出的,这是一个 hack,可能不应该被推荐。
  • @Mittal,SET INDENTITY_INSERT ON|OFF 用于批量插入而不是正常操作,尽管您的代码是可能的,但不推荐。如果插入失败,您的代码会发生什么?设置的 indentity_insert off 永远不会发生
  • @mnieto,同意你的观点,不建议单次插入。当我们插入批量数据时应该使用它。关于 indentity_insert 关闭,我们可以在存储过程的 try 和 catch 块中重置它。
【解决方案2】:

您不应插入 IDENTITY 列。相反,让 SQL Server 为您分配值并将其返回给您的应用程序代码,scope_identity

create procedure dbo.addorupdate
...
begin
  if @node = 'add'
  begin
    insert into tblinfo (firstname, lastname, age, gender) values (@firstname, @lastname, @age, @gender)
    return scope_identity()
  end

【讨论】:

  • 不知道为什么这被否决了,这是一个合理的解决方案。
猜你喜欢
  • 2015-10-18
  • 2018-05-27
  • 2013-06-09
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2012-04-24
相关资源
最近更新 更多