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

C# DataGridView修改数据回写SQL数据库缺失UpdateCommand报错问题

核心问题根因

你遇到的报错本质是computersTableAdapter未正确配置UpdateCommand,你自己写的行跟踪逻辑就算触发,最终调用的还是没有UpdateCommand的TableAdapter.Update方法,自然无法完成更新。

首先解决TableAdapter命令缺失问题(新手优先推荐)

这个是最简单的方案,不需要你自己写行跟踪逻辑:

  • 确保你的数据库_Computers表已经设置了主键,没有主键的话向导无法自动生成Update/Delete语句
  • 打开你的.xsd数据集设计器,右键点击computersTableAdapter选择「配置」
  • 走到「选择命令类型」步骤,确认选中「使用SQL语句」后点击下一步
  • 点击「高级选项」,勾选「生成Insert、Update和Delete语句」,按需选择是否开启开放式并发、刷新数据表,确认后走完配置流程即可
  • 配置完成后恢复你注释掉的this.tableAdapterManager.UpdateAll(this.computers);代码,删除你自己写的行跟踪逻辑即可正常完成增删改操作

你现有代码的问题

如果你要坚持用自定义行跟踪的方案,现有代码有两个明显错误:

  1. 事件绑定对象错误:你监听的是regionBindingSource的PositionChanged事件,但你的数据绑定源是computersBindingSource,切换行时根本不会触发这个方法,LastDataRow始终为空,自然不会执行更新
  2. 最终更新逻辑无效:就算事件触发,你调用的还是原生computersTableAdapter.Update方法,未配置UpdateCommand的前提下还是会抛出原有报错

自定义Update命令的实现方案

如果你不想用向导自动生成命令,可以手动给TableAdapter配置UpdateCommand,在Form_Load的Fill方法执行后添加如下代码即可:

// 按你的实际表字段修改SQL语句
string updateSql = "UPDATE _Computers SET 字段1 = @字段1, 字段2 = @字段2 WHERE 主键字段 = @Original主键";
SqlCommand updateCmd = new SqlCommand(updateSql, computersTableAdapter.Connection);
// 按实际字段类型、长度添加参数
updateCmd.Parameters.Add("@字段1", SqlDbType.NVarChar, 50, "字段1");
updateCmd.Parameters.Add("@字段2", SqlDbType.Int, 0, "字段2");
// 主键参数要取原始值,避免主键被修改的场景
var pkParam = updateCmd.Parameters.Add("@Original主键", SqlDbType.Int, 0, "主键字段");
pkParam.SourceVersion = DataRowVersion.Original;
// 给TableAdapter赋值UpdateCommand
computersTableAdapter.Adapter.UpdateCommand = updateCmd;

配置完成后你的原有行跟踪逻辑修正事件绑定对象后即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:06:09