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

C#中点击按钮后DataGridView无法显示Excel左连接查询数据问题

问题描述

需要在C#中实现点击按钮后,将Excel工作簿的左连接查询结果显示到DataGridView中,数据仅从Excel获取。目前点击按钮后,DataGridView变灰且无数据加载。
该应用用于对比不同Excel工作表数据,已实现将工作表名加载至下拉框(cmbhoja、cmbhoja2),列名加载至对应下拉框(cmbcolumna、cmbcolumna2),需支持动态对比不同名称、数据类型的工作表。

现有代码
private void cargardatos(DataGridView dgv)
{
    try
    {
       
        OleDbDataAdapter oda = new OleDbDataAdapter();
        DataSet ods = new DataSet();
        string consulta;
        //  OleDbConnection cadena;

          OleDbcon.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + openFileDialog.FileName + ";Extended Properties=Excel 12.0;");

          consulta = Convert.ToString(("Select * from [" + cmbhoja.Text + $"\] as [A] LEFT JOIN [" + cmbhoja2.Text + $"\] as [B] ON [A].[" + cmbcolumna.Text + $"\] = [B].[" + cmbcolumna2.Text + $"\]".ToString(), OleDbcon));
           
            oda = new OleDbDataAdapter(consulta, OleDbcon);

          ods.Tables.Add(cmbhoja.Text);
     
        dgv.DataSource = dt;
        this.dtvgreporte.DataSource = dgv;
        MessageBox.Show("Cruce con Exito");

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error ", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
问题分析与修复方案

现有代码存在多个关键问题,导致数据无法正常加载:

  • SQL语句拼接错误:consulta的拼接中误用了Convert.ToString,还错误地将OleDbcon作为参数传入,同时字符串转义符和拼接逻辑混乱,导致生成的SQL语句无效。
  • 未执行数据填充:创建OleDbDataAdapter后,没有调用Fill方法将查询结果填充到DataSet或DataTable中,根本没有获取到数据。
  • DataSource赋值逻辑错误:代码中dt变量未定义,且错误地将dgv作为dtvgreporte的数据源,正确的做法应该是将填充后的DataTable直接绑定到DataGridView。
  • 未正确释放资源:数据库连接和数据适配器未使用using语句,可能导致资源泄漏。

修复后的代码如下:

private void cargardatos(DataGridView dgv)
{
    try
    {
        // 使用using确保资源自动释放
        using (OleDbConnection oleDbCon = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + openFileDialog.FileName + ";Extended Properties=Excel 12.0;"))
        {
            // 正确拼接左连接SQL语句,注意Excel表名需要加$符号
            string consulta = $"SELECT * FROM [{cmbhoja.Text}$] AS [A] LEFT JOIN [{cmbhoja2.Text}$] AS [B] ON [A].[{cmbcolumna.Text}] = [B].[{cmbcolumna2.Text}]";
            
            using (OleDbDataAdapter oda = new OleDbDataAdapter(consulta, oleDbCon))
            {
                DataTable dt = new DataTable();
                // 填充查询结果到DataTable
                oda.Fill(dt);
                
                // 绑定数据到目标DataGridView
                dgv.DataSource = dt;
                // 如果dtvgreporte是独立的DataGridView,直接绑定数据即可
                this.dtvgreporte.DataSource = dt;
                
                MessageBox.Show("数据对比完成");
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

额外说明:

  • Excel表名需要加上$符号(比如Sheet1$),这是OLEDB连接Excel的规范要求。
  • 使用using语句包裹OleDbConnection和OleDbDataAdapter,确保连接和资源被及时释放。
  • 用字符串插值简化SQL拼接,避免转义符错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:45:30