C# DataGridView修改数据回写SQL数据库缺失UpdateCommand报错问题
核心问题根因
你遇到的报错本质是computersTableAdapter未正确配置UpdateCommand,你自己写的行跟踪逻辑就算触发,最终调用的还是没有UpdateCommand的TableAdapter.Update方法,自然无法完成更新。
首先解决TableAdapter命令缺失问题(新手优先推荐)
这个是最简单的方案,不需要你自己写行跟踪逻辑:
- 确保你的数据库
_Computers表已经设置了主键,没有主键的话向导无法自动生成Update/Delete语句 - 打开你的
.xsd数据集设计器,右键点击computersTableAdapter选择「配置」 - 走到「选择命令类型」步骤,确认选中「使用SQL语句」后点击下一步
- 点击「高级选项」,勾选「生成Insert、Update和Delete语句」,按需选择是否开启开放式并发、刷新数据表,确认后走完配置流程即可
- 配置完成后恢复你注释掉的
this.tableAdapterManager.UpdateAll(this.computers);代码,删除你自己写的行跟踪逻辑即可正常完成增删改操作
你现有代码的问题
如果你要坚持用自定义行跟踪的方案,现有代码有两个明显错误:
- 事件绑定对象错误:你监听的是
regionBindingSource的PositionChanged事件,但你的数据绑定源是computersBindingSource,切换行时根本不会触发这个方法,LastDataRow始终为空,自然不会执行更新 - 最终更新逻辑无效:就算事件触发,你调用的还是原生
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
相关产品推荐
相关产品推荐

