如何通过选择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
相关产品推荐
相关产品推荐

