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
相关产品推荐
相关产品推荐

