C#更新SQL Server表数据:DataGridView更新报错及代码问题求解
C#更新SQL Server数据并刷新DataGridView失败的问题分析与解决
你的问题代码
我编写了一段用于更新SQL Server表数据并刷新DataGridView的C#代码:
string con = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\kavindu yasintha\Documents\billmangment.mdf;Integrated Security=True;Connect Timeout=30"; string q = "SELECT * FROM member"; SqlDataAdapter ad = new SqlDataAdapter(q, con); SqlCommandBuilder builder = new SqlCommandBuilder(ad); DataSet set = new DataSet(); ad.Update(set.Tables["member"]); ad.Fill(set, "member"); dataGridView1.DataSource = set.Tables["member"]; MessageBox.Show("Updated");但这段代码无法正常实现数据更新与DataGridView刷新,请问该代码存在什么错误?如何正确添加代码以实现DataGridView的数据更新?
代码里的核心错误
这几个问题是新手操作DataGridView和数据库时很容易踩的坑:
- 调用顺序完全颠倒:你先执行了
ad.Update(set.Tables["member"]),但此时DataSet是空的(还没调用Fill加载数据),Update操作找不到任何要更新的内容,等于无效执行。 - 未捕获DataGridView的修改:代码完全没把用户在DataGridView中编辑的数据同步回DataTable,数据库根本不知道你要修改什么内容。
- 数据源关联缺失:新建的空DataSet和当前DataGridView绑定的数据源没有任何关联,修改无法传递到数据库层面。
正确的实现方案
要实现「修改DataGridView→更新数据库→刷新界面」的完整流程,需要遵循捕获修改→同步数据库→重新加载数据的逻辑,以下是修正后的完整代码:
// 先获取当前DataGridView绑定的DataTable(前提是你之前已经通过Fill加载过数据并完成绑定) DataTable memberTable = dataGridView1.DataSource as DataTable; if (memberTable != null) { string con = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\kavindu yasintha\Documents\billmangment.mdf;Integrated Security=True;Connect Timeout=30"; string q = "SELECT * FROM member"; SqlDataAdapter ad = new SqlDataAdapter(q, con); SqlCommandBuilder builder = new SqlCommandBuilder(ad); try { // 确保结束当前单元格的编辑状态,避免未提交的修改丢失 dataGridView1.EndEdit(); // 标记DataTable当前状态为已提交,方便后续追踪修改内容 memberTable.AcceptChanges(); // 将DataTable中的修改同步到数据库 int affectedRows = ad.Update(memberTable); if (affectedRows > 0) { // 重新加载数据库最新数据,刷新DataGridView DataSet set = new DataSet(); ad.Fill(set, "member"); dataGridView1.DataSource = set.Tables["member"]; MessageBox.Show($"成功更新{affectedRows}条数据"); } else { MessageBox.Show("没有数据需要更新"); } } catch (Exception ex) { MessageBox.Show($"更新失败:{ex.Message}"); } } else { MessageBox.Show("DataGridView未绑定有效数据源,请先加载数据"); }
关键细节说明
- 提交编辑状态:
dataGridView1.EndEdit()是必须的,如果用户正在编辑单元格,不执行这个操作的话,修改的数据不会同步到DataTable中。 - Update的正确时机:必须在DataTable包含修改内容的情况下调用
ad.Update(),且要基于已经加载过数据的DataTable对象。 - 异常处理:添加try-catch可以捕获数据库操作中的各类错误(比如主键冲突、数据类型不匹配、权限不足等),方便你排查问题。
- 重新加载数据:更新数据库后重新执行Fill并绑定,能确保DataGridView显示的是数据库的最新状态,避免界面与数据不一致的情况。
内容的提问来源于stack exchange,提问作者Kavindu Yasintha Silva
相关产品推荐
相关产品推荐

