WinForm使用MS Access填充DataGrid时报COMPLEX DATA BINDING错误如何解决
报错原因与修复方案
核心报错原因
你出现COMPLEX DATA BINDING ACCEPTS DATA SOURCE AS ILIST错误的直接原因是:在comboBox1_SelectedIndexChanged方法中直接将OleDbCommand类型的ada对象赋值给了dataGrid1.DataSource。
DataGrid的数据源仅接受实现了IList接口的类型(比如DataTable、DataSet、泛型List、DataView等),而OleDbCommand是数据库命令执行对象,本身不存储任何查询结果,完全不符合数据绑定要求。
代码存在的其他问题
- 使用
ExecuteNonQuery()执行查询语句逻辑错误:该方法仅用于执行INSERT/UPDATE/DELETE这类写操作,仅返回受影响行数,不会返回任何查询结果。 - 冗余查询:窗体加载时已经将全量Student表数据加载到全局
DataSet d1中,选中学生ID后无需再次请求数据库,直接过滤本地数据即可,性能更高。 - 组合框填充逻辑遗漏最后一行:循环条件写为
i < x,而x是总行数减1,最后一行数据不会被添加到组合框中。 - 数据库连接未释放:全局连接对象
con在窗体加载时打开后没有关闭,存在资源泄漏风险。
修复后的完整代码
using System.Data.OleDb; using System.Windows.Forms; namespace P1 { public partial class Form2 : Form { OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source =d:\DDBS.mdb"); OleDbDataAdapter adap = new OleDbDataAdapter("Select * from Student", @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source =d:\DDBS.mdb"); DataSet d1 = new DataSet("Student"); private void Form2_Load(object sender, EventArgs e) { // Fill方法会自动管理连接状态,不需要手动打开连接 adap.Fill(d1, "Student"); // 修复循环条件,避免遗漏最后一行数据 int rowCount = d1.Tables["Student"].Rows.Count; for (int i = 0; i < rowCount; i++) { comboBox1.Items.Add(d1.Tables["Student"].Rows[i]["sid"]); } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { // 直接过滤本地已加载的数据集,无需再次查询数据库 DataView studentView = d1.Tables["Student"].DefaultView; studentView.RowFilter = $"sid = '{comboBox1.SelectedItem.ToString()}'"; dataGrid1.DataSource = studentView; MessageBox.Show("DONE"); } } }
内容的提问来源于stack exchange,提问作者Hoho Santa
相关产品推荐
相关产品推荐

