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

在C#中更新含标识列的两个SQL Server表的报错解决问询

解决TBL_PO_Cart更新时“无法更新标识列”的问题

首先看你的UpdatePOCartTable方法里有两处明显的参数类型错误,这大概率是触发问题的核心原因,另外还需要排查表结构和DataGridView的配置情况:

1. 修正参数类型错误

你的代码里对UnitPrice和OrderQuantity的参数类型设置完全错误,这会导致SQL Server解析参数时出现异常,甚至可能间接触发标识列的更新逻辑:

  • UnitPrice是decimal类型,你却设置成了SqlDbType.Date
  • OrderQuantity是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:39:35