在C#中更新含标识列的两个SQL Server表的报错解决问询
解决TBL_PO_Cart更新时“无法更新标识列”的问题
首先看你的UpdatePOCartTable方法里有两处明显的参数类型错误,这大概率是触发问题的核心原因,另外还需要排查表结构和DataGridView的配置情况:
1. 修正参数类型错误
你的代码里对UnitPrice和OrderQuantity的参数类型设置完全错误,这会导致SQL Server解析参数时出现异常,甚至可能间接触发标识列的更新逻辑:
UnitPrice是decimal类型,你却设置成了SqlDbType.DateOrderQuantity是int类型,你设置成了SqlDbType.NVarChar
修正后的UpdatePOCartTable方法代码:
public void UpdatePOCartTable(int PO_No,string ISBN_No, decimal UnitPrice, int OrderQuantity, decimal Total) { DynamicConnection con = new DynamicConnection(); con.mysqlconnection(); string query = "UPDATE TBL_PO_Cart" + " SET ISBN_No=@ISBN_No,UnitPrice=@UnitPrice," + "OrderQuantity=@OrderQuantity,Total=@Total" + " WHERE PO_No = @PO_No"; con.sqlquery(query); con.cmd.Parameters.Add(new SqlParameter("@PO_No", SqlDbType.Int)); con.cmd.Parameters["@PO_No"].Value = PO_No; con.cmd.Parameters.Add(new SqlParameter("@ISBN_No", SqlDbType.NVarChar)); con.cmd.Parameters["@ISBN_No"].Value = ISBN_No; // 修正UnitPrice的参数类型为Decimal con.cmd.Parameters.Add(new SqlParameter("@UnitPrice", SqlDbType.Decimal)); con.cmd.Parameters["@UnitPrice"].Value = UnitPrice; // 修正OrderQuantity的参数类型为Int con.cmd.Parameters.Add(new SqlParameter("@OrderQuantity", SqlDbType.Int)); con.cmd.Parameters["@OrderQuantity"].Value = OrderQuantity; con.cmd.Parameters.Add(new SqlParameter("@Total", SqlDbType.Money)); con.cmd.Parameters["@Total"].Value = Total; con.nonquery(); }
2. 排查TBL_PO_Cart表结构与DataGridView配置
确认TBL_PO_Cart表的标识列(比如自增主键,假设是类似Cart_ID的列)没有出现在UPDATE语句中。如果你的DataGridView绑定了这个标识列且设置为可编辑状态,更新时DataGridView可能会尝试提交该列的修改,从而触发“无法更新标识列”的错误:
- 打开SQL Server Management Studio,查看
TBL_PO_Cart的表结构,找到标识列(属性里“标识规范”为“是”的列) - 检查DataGridView是否包含该列,若存在,将该列的
ReadOnly属性设为true,或者直接隐藏该列
3. 检查DynamicConnection封装逻辑
确保你的DynamicConnection类的nonquery()方法没有额外自动添加列到更新语句的逻辑,避免误操作标识列。如果这个类封装了DbCommand的执行流程,要确认它没有修改你传入的原始SQL语句。
先修正参数类型的问题,这是最直观的错误,之后再排查表结构和DataGridView的配置,应该就能解决“无法更新标识列”的问题了。
内容的提问来源于stack exchange,提问作者Kith
相关产品推荐
相关产品推荐

