C#向含Identity列的表插入数据时,列名与表达式数量不匹配?
解决Identity主键表插入时的列数不匹配与不可编辑异常问题
问题根源分析
- 列数与值数不匹配:你第一个
INSERT语句中,tblCost指定了5列(StartDay, EndDay, PCost, NumOfCustomers, Total),但VALUES里写了6个表达式(null, @StartDate, @EndDate, @PCost, @NumOfCustomers, @Total),这直接触发了异常提示的「列名计数与源表达式计数不匹配」。 - 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
相关产品推荐
相关产品推荐

