修复选择ComboBox值填充级联ComboBox时的SQL语法错误
问题解决步骤
1. 修复第一个ComboBox加载失败的问题
你的LoadCombo方法中创建了SqlDataAdapter和DataTable,但未调用da.Fill(dt)填充数据,导致dt.Rows为空,ComboBox1根本加载不到表名。
2. 修复ComboBox2的SQL语法错误
- 表名不能用单引号包裹,SQL Server中若表名含特殊字符或关键字,需用方括号
[]包裹; - 查询列名的SQL语句错误,不能直接
select distinct ColumnName from 表名,正确方式是查询系统视图(如INFORMATION_SCHEMA.COLUMNS)获取列名,更可靠; - 每次选择新表时,需先清空ComboBox2的旧数据,避免重复添加;
- 使用
using语句自动释放数据库连接资源,防止连接泄漏。
修正后的完整代码
加载ComboBox1的方法
private void LoadCombo() { try { // using语句自动释放连接资源 using (SqlConnection conn = new SqlConnection(@"Data source=SERVER\SOURCE;Initial Catalog=MyDatabase; Integrated security=true;")) { string sql = "select name from sys.tables where type = 'U'"; SqlDataAdapter da = new SqlDataAdapter(sql, conn); DataTable dt = new DataTable(); da.Fill(dt); // 关键步骤:填充数据到DataTable comboBox1.Items.Clear(); foreach (DataRow row in dt.Rows) { comboBox1.Items.Add(row["name"].ToString()); } } } catch (Exception ex) { MessageBox.Show("加载表名失败:" + ex.Message); } }
ComboBox1选择事件处理方法
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (string.IsNullOrEmpty(comboBox1.Text)) return; try { using (SqlConnection conn = new SqlConnection(@"Data source=SERVER\SOURCE;Initial Catalog=MyDatabase; Integrated security=true;")) { // 用INFORMATION_SCHEMA.COLUMNS查询列名,符合SQL规范 string sql = @"select distinct COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName"; SqlDataAdapter da = new SqlDataAdapter(sql, conn); // 参数化查询,避免SQL注入,同时适配特殊表名 da.SelectCommand.Parameters.AddWithValue("@TableName", comboBox1.Text); DataTable dt = new DataTable(); da.Fill(dt); comboBox2.Items.Clear(); // 清空旧数据,保证新数据准确 foreach (DataRow row in dt.Rows) { comboBox2.Items.Add(row["COLUMN_NAME"].ToString()); } } } catch (Exception ex) { MessageBox.Show("加载列名失败:" + ex.Message); } }
关键说明
using语句自动管理数据库连接生命周期,避免资源泄漏;- 参数化查询规避SQL注入风险,同时兼容含特殊字符的表名;
- 查询系统视图获取列名,不受表数据为空的影响,结果更可靠;
- 每次加载前清空ComboBox旧数据,避免数据重复或混乱。
内容的提问来源于stack exchange,提问作者krešimir šumiga
相关产品推荐
相关产品推荐

