只有在使用列列表并且IDENTITY_INSERT为ON时,才能指定表'Table'中标识列的显式值

时间:2011-03-03 14:51:31

标签: c# asp.net sql

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

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

异常详细信息:System.Data.SqlClient.SqlException:只有在使用列列表且IDENTITY_INSERT为ON时,才能指定表'HD_AANVRAAG_FASE'中标识列的显式值。)表示? 任何帮助表示赞赏。

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();
    }

3 个答案:

答案 0 :(得分:3)

由于您没有明确指定列,我认为@fase_id正在传递到IDENTITY列,,因为错误表示除非您不能这样做你通过IDENTITY_INSERT强迫它。

通常,你让DB生成这个;指定INSERT 省略 标识列中的列(并且不要尝试分配值)。 INSERT您的新ID可用SCOPE_IDENTITY()后直接显示。

答案 1 :(得分:3)

您的代码包含

最后

SET IDENTITY_INSERT HD_AANVRAAG_FASE OFF

但不是相应的

开始时

SET IDENTITY_INSERT HD_AANVRAAG_FASE ON

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

答案 2 :(得分:1)

你错过了

SET IDENTITY_INSERT HD_AANVRAAG_FASE ON

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

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