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

如何通过选择ComboBox中的表名在DataGridView中展示对应表的全部数据

问题修复说明

你的代码核心错误出在查询表数据的SQL语法,以及资源管理逻辑上,具体问题和修正方案如下:

存在的问题

  • 查询语句语法不符合MySQL规范:
    • 你写的select table_name from ['"+ comboBox1.Text + "']逻辑完全错误,要获取整张表的所有内容需要用SELECT *而非查询固定的table_name字段
    • MySQL不需要用[]、单引号包裹表名,多余的符号会导致数据库无法识别表名
  • 没有手动释放数据库连接、命令对象资源,容易出现连接泄漏
  • 没有对ComboBox选中值做非空校验,选中空值时会触发异常

修正后代码

// 窗体加载事件逻辑不变,优化了资源释放逻辑
private void samples_Load(object sender, EventArgs e)
{
    MySqlConnection con = new MySqlConnection(conn);
    try
    {
        con.Open();
        MySqlCommand sqlCmd = new MySqlCommand();
        sqlCmd.Connection = con;
        sqlCmd.CommandType = CommandType.Text;
        sqlCmd.CommandText = "select table_name from information_schema.tables where table_schema = 'attenddb'";
        MySqlDataAdapter sqlDataAdap = new MySqlDataAdapter(sqlCmd);
        DataTable dtRecord = new DataTable();
        sqlDataAdap.Fill(dtRecord);
        comboBox1.DataSource = dtRecord;
        comboBox1.DisplayMember = "TABLE_NAME";
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        if(con.State == ConnectionState.Open)
            con.Close();
    }
}

private void button1_Click(object sender, EventArgs e)
{
    // 先判断是否选中了表名
    if(string.IsNullOrWhiteSpace(comboBox1.Text))
    {
        MessageBox.Show("请先选择要查询的表");
        return;
    }
    // 用using自动释放所有数据库对象资源,不需要手动关闭连接
    using(MySqlConnection con2 = new MySqlConnection(conn))
    {
        try
        {
            // 修正SQL语句,用反引号包裹表名兼容带特殊符号的表名
            string query2 = $"select * from `{comboBox1.Text}`";
            MySqlCommand com2 = new MySqlCommand(query2, con2);
            MySqlDataAdapter myadapt = new MySqlDataAdapter(com2);
            DataTable dtable = new DataTable();
            myadapt.Fill(dtable);
            dataGridView1.DataSource = dtable;
        }
        catch(Exception ex)
        {
            MessageBox.Show($"加载数据出错:{ex.Message}");
        }
    }
}

可选优化

如果需要实现选中ComboBox选项后自动加载数据,不需要点击按钮,只需要给ComboBox绑定SelectedIndexChanged事件,把按钮点击事件里的加载逻辑复制到该事件中即可。

注意:这里因为ComboBox的所有选项都是从系统表查询出来的合法表名,所以直接拼接SQL不会存在SQL注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:57:04