【问题标题】:SQL Insert command throwing errorsSQL 插入命令引发错误
【发布时间】:2017-07-06 08:16:27
【问题描述】:
 System.Data.SqlClient.SqlException occurred   HResult=0x80131904   Message=Cannot insert explicit value for identity column in table 'DriversDetailsTable' when IDENTITY_INSERT is set to OFF.   Source=.Net SqlClient Data Provider   StackTrace: <Cannot evaluate the exception stack trace>

当我运行我的代码时,我不断收到上述错误,不知道为什么。这是我的代码:

SqlConnection conn = new SqlConnection(@"Data Source = ComputerName\SQLEXPRESS;Initial Catalog = Drivers;Trusted_Connection=True;");
        conn.Open();

        SqlDataAdapter adapter = new SqlDataAdapter();

        SqlCommand command = new SqlCommand($@"INSERT INTO DriversDetailsTable (name, Id, DateJoined) VALUES ('Driver4', 1, '2017-07-06')", conn);
        command.ExecuteNonQuery();

        conn.Close();

【问题讨论】:

  • 你的 SQL 是问题所在。开头的第 4 列是自动递增的吗?

标签: c# sql


【解决方案1】:

是的,那是因为您的 Id 列是 IDENTITY 列,因此您应该在您的 INSERT 语句中省略它,如下所示。由于它是 IDENTITY 列,因此您不能显式为其插入值,除非您将 IDENTITY_INSERT 设置为 OFF,而您认为无论如何您都不想这样做

INSERT INTO DriversDetailsTable (name, DateJoined) VALUES ('Driver4', '2017-07-06')

旁注:当您使用硬编码/静态值时,看不到 C# 6 字符串插值语法 $@"INSERT 的原因

【讨论】:

    【解决方案2】:

    大概Id 是一个IDENTITY 列。因此,您不应尝试将 INSERT 放入 Id 列 - 从 INSERT 语句中省略它,并让数据库告诉它分配了哪个数字:

    SqlCommand command = new SqlCommand($@"
    INSERT INTO DriversDetailsTable (name, DateJoined) VALUES ('Driver4', '2017-07-06');
    SELECT SCOPE_IDENTITY();", conn);
    

    并使用ExecuteScalar() 取回值:

    int id = (id)(decimal)command.ExecuteScalar();
    

    (请参阅 Why does select SCOPE_IDENTITY() return a decimal instead of an integer? 了解演员阵容)

    其他选项:

    • 让它不是IDENTITY
    • 如果您需要特定值,请在此操作期间暂时禁用身份插入(大多数情况下不推荐)

    【讨论】:

      【解决方案3】:

      如果您出于某种原因确实希望能够插入 id,则需要将 IDENTITY_INSERT 设置为 ON,如下所示:

      Set Identity_Insert DriverDetailsTable ON;
      

      这可以仅针对特定命令完成,如下所示:

      SqlCommand command = new SqlCommand($@"
      Set Identity_Insert DriverDetailsTable ON;
      INSERT INTO DriversDetailsTable (name, Id, DateJoined) VALUES ('Driver4', 1, '2017-07-06');
      Set Identity_Insert DriverDetailsTable OFF;", conn);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-27
        • 2022-08-18
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多