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

使用DataAdapter无法更新MySQL数据源问题求助

DataAdapter更新失败的原因及解决方法

核心原因

你遇到的问题本质是DataSet中的DataRow未被标记为修改状态,而DataAdapter.Update()仅会处理RowState为Modified、Added或Deleted的行,未变更的行(Unchanged状态)会被直接忽略。导致这个问题的具体因素有两个:

  • 默认数据绑定是单向的:当前绑定仅实现了从DataSet到文本框的单向显示,文本框的修改不会自动同步回DataSet的DataRow。
  • 未结束编辑状态:如果文本框仍处于焦点状态,输入的新值可能还没提交到DataRow中。

解决步骤

1. 改为双向数据绑定

修改绑定代码,指定DataSourceUpdateMode.OnPropertyChanged,确保文本框内容变化时立刻同步到DataSet:

textBox6.DataBindings.Add("Text", teacher.Tables[0], "AM", true, DataSourceUpdateMode.OnPropertyChanged);

参数说明:

  • true:允许格式化值
  • DataSourceUpdateMode.OnPropertyChanged:文本框内容变化时立即更新数据源

2. 更新前强制结束编辑

在调用adapter.Update()前,先结束当前编辑操作,确保文本框的最新值已经写入DataRow:

// 提交文本框的编辑内容到DataSet
this.BindingContext[teacher.Tables[0]].EndCurrentEdit();

// 执行更新
adapter.Update(teacher, "teacher");

3. 调试验证(可选)

如果仍有问题,可以在更新前检查DataRow的状态,确认是否已标记为Modified:

foreach (DataRow row in teacher.Tables[0].Rows)
{
    // 输出行状态,正常应显示Modified
    MessageBox.Show(row.RowState.ToString());
}

补充说明

你直接用ExecuteNonQuery()能成功,是因为这种方式绕过了DataSet的行状态检查,直接执行SQL语句操作数据库,不需要依赖DataSet的变更标记。而DataAdapter的设计逻辑是基于DataSet的行状态来决定是否执行对应SQL,所以必须确保DataRow处于修改状态才能触发更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 19:12:43