ComboBox选择后无法填充DataGridView的问题求助
修复ComboBox选择后DataGridView加载数据的错误
从你的代码和报错情况来看,核心问题是SQL语句拼接的语法错误,同时还存在资源管理不当的问题。下面一步步帮你解决:
错误原因分析
你的comboBox1_SelectionChangeCommitted方法里,直接把comboBox1.SelectedValue拼进SQL语句中:
- 如果
Mã đề tài是字符串类型,会因为没有给值加单引号导致SQL语法错误; - 就算是数字类型,这种写法也存在严重的SQL注入风险;
- 另外数据库连接、DataAdapter没有正确释放,容易引发资源泄漏。
修正后的完整代码
// 把连接字符串抽成常量,避免重复编写,后续修改更方便 private const string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;data source= D:\\Database\\đồ án\\Đồ án.mdb"; private void Form2_Load(object sender, EventArgs e) { // 使用using语句自动释放数据库连接资源,不用手动Dispose using (OleDbConnection con = new OleDbConnection(ConnectionString)) { DataTable dt = new DataTable(); OleDbDataAdapter da = new OleDbDataAdapter("Select * from Sheet1", con); da.Fill(dt); comboBox1.DataSource = dt; comboBox1.DisplayMember = "Tên đề tài"; comboBox1.ValueMember = "Mã đề tài"; } } private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e) { // 先判断SelectedValue是否为空,避免空引用崩溃 if (comboBox1.SelectedValue == null) return; using (OleDbConnection con = new OleDbConnection(ConnectionString)) { DataTable dt = new DataTable(); // 用参数化查询,避免语法错误和SQL注入,字段名加方括号适配特殊字符 string sql = "Select * from Sheet11 Where [Mã đề tài] = @MaDeTai"; OleDbDataAdapter da = new OleDbDataAdapter(sql, con); // 根据字段实际类型选择OleDbType,比如如果是数字就用OleDbType.Integer da.SelectCommand.Parameters.Add("@MaDeTai", OleDbType.VarChar).Value = comboBox1.SelectedValue.ToString(); da.Fill(dt); dataGridView1.DataSource = dt; } }
关键改进点说明
- 参数化查询:这是解决当前问题的核心,通过
@MaDeTai参数传递值,数据库会自动处理类型和引号问题,同时彻底避免SQL注入风险。 using语句管理资源:自动释放数据库连接、DataAdapter等实现IDisposable接口的资源,不用手动调用Dispose,防止资源泄漏。- 特殊字段名处理:因为你的字段名包含空格和重音字符,用
[Mã đề tài]包裹可以避免SQL语法识别错误。 - 空值判断:添加
comboBox1.SelectedValue == null的判断,防止程序因空引用崩溃。
额外检查项
- 确认
Sheet11表中确实存在Mã đề tài字段,且字段类型和Sheet1中的Mã đề tài类型一致; - 数据库文件路径是否正确,确保程序运行时能访问到该路径(如果是发布程序,建议使用相对路径或者配置文件存储路径)。
内容的提问来源于stack exchange,提问作者Matatabi2309
相关产品推荐
相关产品推荐

