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

C# SQL:如何通过Table Adapter更新DataGridView?现有方法未生效

解决C#中DataGridView无法显示SQL最新数据的问题

首先,咱们先拆解下你当前代码里的几个核心问题,然后一步步给出修复方案:

  1. 资源管理漏洞:你手动控制连接的打开和关闭,但如果代码抛出异常,con.Close()可能不会执行,导致数据库连接泄漏。
  2. 数据源绑定逻辑缺陷:直接赋值新DataTable给DataSource时,控件可能复用旧的绑定上下文,忽略新数据。
  3. 潜在的SQL缓存问题:默认情况下SQL Server可能缓存查询结果,导致你读取不到刚提交的最新数据。

修正后的基础版代码

public void DoUpdate()
{
    // 替换成你的实际数据库连接字符串
    string connectionString = "Server=你的服务器地址;Database=你的数据库名;Trusted_Connection=True;";
    
    // 使用using语句自动释放连接和适配器资源,避免泄漏
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        con.Open();
        // 加入OPTION (NOLOCK)确保读取最新提交的数据(可根据业务场景调整隔离级别)
        string query = "SELECT * FROM Stock_table OPTION (NOLOCK)";
        using (SqlDataAdapter adapter = new SqlDataAdapter(query, con))
        {
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            
            // 先清空旧数据源,强制控件重新绑定新数据
            dataGridView1.DataSource = null;
            dataGridView1.DataSource = dt;
        }
    }
}

更优雅的BindingSource方案

如果需要频繁更新数据,推荐用BindingSource作为DataGridView和DataTable的中间层,代码更简洁且避免重复重置数据源:

// 在窗体类中声明全局的BindingSource实例
private readonly BindingSource _stockBindingSource = new BindingSource();

// 窗体初始化时完成首次绑定
private void YourForm_Load(object sender, EventArgs e)
{
    _stockBindingSource.DataSource = GetStockData();
    dataGridView1.DataSource = _stockBindingSource;
}

// 封装获取数据的方法,复用性更强
private DataTable GetStockData()
{
    string connectionString = "你的连接字符串";
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        con.Open();
        using (SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Stock_table", con))
        {
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            return dt;
        }
    }
}

// 更新方法简化为:
public void DoUpdate()
{
    // 获取最新数据并更新BindingSource
    _stockBindingSource.DataSource = GetStockData();
    // 强制控件刷新绑定内容
    _stockBindingSource.ResetBindings(false);
}

额外排查点

如果还是看不到最新数据,检查这几个常见坑:

  • 数据是否真的提交到数据库:确认修改数据的代码执行了SqlCommand.ExecuteNonQuery(),且没有事务回滚的情况。
  • 连接字符串是否正确:别不小心连接到测试库而非生产库!
  • 跨线程操作问题:如果在非UI线程调用DoUpdate,需要用Invoke确保UI操作在主线程执行:
    public void DoUpdate()
    {
        if (dataGridView1.InvokeRequired)
        {
            dataGridView1.Invoke(new Action(DoUpdate));
            return;
        }
        // 上面的更新逻辑
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:47:50