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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:13:02