【问题标题】:An explicit value for the identity column in table 'Table' can only be specified when a column list is used and IDENTITY_INSERT is ON只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表“表”中的标识列指定显式值
【发布时间】:2011-07-08 03:01:37
【问题描述】:

有人知道这个错误是什么吗 (只有在使用列列表且 IDENTITY_INSERT 为 ON 时,才能为表 'HD_AAANVRAAG_FASE' 中的标识列指定显式值。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.Data.SqlClient.SqlException:表“HD_AANVRAAG_FASE”中标识列的显式值只能在使用列列表并且 IDENTITY_INSERT 为 ON 时指定。)是什么意思? 任何帮助表示赞赏。

private void Insert2()
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HELPDESK_OUTLOOKConnectionString3"].ToString());

        conn.Open();
        SqlCommand dCmd2 = new SqlCommand(
            "INSERT INTO HD_AANVRAAG_FASE VALUES (@fase_id, @aanvraag_id, @status_id, "
                + "@werknemer_id, @fase_datum) SET IDENTITY_INSERT HD_AANVRAAG_FASE OFF ",
            conn);



        dCmd2.Parameters.AddWithValue("@fase_id", 1);
        dCmd2.Parameters.AddWithValue("@aanvraag_id", 2622);
        dCmd2.Parameters.AddWithValue("@status_id", 15);
        dCmd2.Parameters.AddWithValue("@werknemer_id", 165);
        dCmd2.Parameters.AddWithValue("@fase_datum", "12-12-2001");
        dCmd2.ExecuteNonQuery();
        conn.Close();
    }

【问题讨论】:

  • HD_AAVRAAG 表的主键是什么? aanvraag_id?它是一个身份列吗?
  • 不,HD_AAANVRAAG_FASE的主键是fase_id。我怎么知道它是否是一个标识列,那是什么?
  • 如果你有一个标识列,那么你不应该在应用程序中打开和关闭 identity_insert!这是一个自动生成的数字是有原因的。让数据库正常工作或将身份从表中删除并创建自己的 ID(通常是个坏主意,因为如果您犯了错误,可能会严重破坏数据完整性)。暂时关闭身份的能力应该只用于偶尔的数据迁移,通常不通过应用程序完成。
  • Tassisto,如果您不了解您的数据库表结构(身份是其中的一部分),那么您就没有业务编写代码来插入记录,因为您对数据的完整性有积极的危险。
  • 我问了我的 sql server 专家(因为他是制作数据库的人)这个问题是什么,他告诉我不允许我将 fase_id 作为参数。因为 fase_id 是自动生成的。那是我做错了!!!!

标签: c# asp.net sql


【解决方案1】:

您的代码包含

SET IDENTITY_INSERT HD_AANVRAAG_FASE OFF 结尾

但不是对应的

SET IDENTITY_INSERT HD_AANVRAAG_FASE ON 开头

您为什么要以任何方式明确插入这些内容?是同步任务吗?

【讨论】:

  • @Massimo - SET IDENTITY_INSERT HD_AANVRAAG_FASE ON 不是在您的代码中,这就是问题所在。如果您实际需要插入显式值,则将其设置为开启,或者完全删除插入到HD_AANVRAAG_FASE 以获取自动生成的identity 值的尝试。
  • 打开/关闭它不是很合理。问题是我可能不会在参数列表中给出它。
【解决方案2】:

你错过了一个

SET IDENTITY_INSERT HD_AANVRAAG_FASE ON

在运行插入之前。这就是错误的确切原因。

也就是说,显式插入标识值很少见 - 例如,仅在将数据从一个表复制到另一个表时使用,或使用显式 ID 初始化新表时使用。通常,您只想从 INSERT 中省略标识值,这也可以避免错误。

【讨论】:

  • 所以我必须关闭它(这是一个更糟糕的问题),因为我可以覆盖数据!
【解决方案3】:

由于您没有明确指定列,我假设 @fase_id 被传递到 IDENTITY 列中,如错误所示除非您通过IDENTITY_INSERT.

通常,您让数据库生成它;指定INSERT 中的列并省略 标识列(不要尝试分配值)。 INSERT 之后的直接是您的新 ID,即 SCOPE_IDENTITY()

【讨论】:

  • 我不明白你在说什么? :s :s
  • 标识列是具有生成值的列。听起来您正在尝试将值推入其中。这不是您通常使用标识列的方式...
猜你喜欢
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2013-06-05
  • 2023-04-08
  • 1970-01-01
  • 2016-10-21
相关资源
最近更新 更多