You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#向含Identity列的表插入数据时,列名与表达式数量不匹配?

解决Identity主键表插入时的列数不匹配与不可编辑异常问题

问题根源分析

  1. 列数与值数不匹配:你第一个INSERT语句中,tblCost指定了5列(StartDay, EndDay, PCost, NumOfCustomers, Total),但VALUES里写了6个表达式(null, @StartDate, @EndDate, @PCost, @NumOfCustomers, @Total),这直接触发了异常提示的「列名计数与源表达式计数不匹配」。
  2. Identity列错误操作:你尝试添加Default触发不可编辑异常,是因为Identity自动递增列由数据库自动生成值,不允许手动指定值或DEFAULT,插入时只需忽略该列即可。

解决方案

1. 修正INSERT语句

直接删除VALUES中多余的null,让列数与值数完全对应:

comm.CommandText = "INSERT INTO tblCost (StartDay, EndDay, PCost, NumOfCustomers, Total) VALUES (@StartDate, @EndDate, @PCost, @NumOfCustomers, @Total)";

2. (优化)自动获取刚插入的CostID

如果tblBookings的CostID需要关联刚插入到tblCost的记录,不要手动传CostID参数,而是用SCOPE_IDENTITY()获取数据库自动生成的Identity值,避免关联错误:

// 执行第一个插入
comm.ExecuteNonQuery();
// 获取刚生成的CostID
int newCostID = Convert.ToInt32(new SqlCeCommand("SELECT SCOPE_IDENTITY()", cn).ExecuteScalar());
// 修正第二个插入的参数
comm2.Parameters.Add("@CostID", SqlDbType.BigInt).Value = newCostID;
comm2.ExecuteNonQuery();

修正后的完整代码

public static void AddBooking(DateTime StartDate, DateTime EndDate, int PCost, int NumofCustomers, int Total, String Username)
{
    using (var cn = new SqlCeConnection(TheDataConnection))             
    {
        cn.Open();

        // 插入tblCost
        SqlCeCommand comm = new SqlCeCommand();
        comm.Connection = cn;
        comm.CommandText = "INSERT INTO tblCost (StartDay, EndDay, PCost, NumOfCustomers, Total) VALUES (@StartDate, @EndDate, @PCost, @NumOfCustomers, @Total)";

        comm.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = StartDate;
        comm.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = EndDate;
        comm.Parameters.Add("@PCost", SqlDbType.Int).Value = PCost;
        comm.Parameters.Add("@NumOfCustomers", SqlDbType.Int).Value = NumofCustomers;
        comm.Parameters.Add("@Total", SqlDbType.Int).Value = Total;

        comm.ExecuteNonQuery();

        // 获取刚生成的CostID并插入tblBookings
        int newCostID = Convert.ToInt32(new SqlCeCommand("SELECT SCOPE_IDENTITY()", cn).ExecuteScalar());
        SqlCeCommand comm2 = new SqlCeCommand();
        comm2.Connection = cn;
        comm2.CommandText = "INSERT INTO tblBookings (Username, CostID) VALUES (@Username, @CostID)";

        comm2.Parameters.Add("@Username", SqlDbType.NVarChar).Value = Username;
        comm2.Parameters.Add("@CostID", SqlDbType.BigInt).Value = newCostID;
        
        comm2.ExecuteNonQuery();

        cn.Close();
    }
}

内容的提问来源于stack exchange,提问作者LusunguPryme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:20:34