C#技术问题:工具库系统中如何用Access数据库填充已有DataGridView
嘿,针对你要实现的「从左侧PO列表选单后填充历史采购数据到DataGridView」这个需求,我结合你之前写的代码,给你整理了一套完整且安全的实现方案,咱们一步步来:
采购订单列表填充DataGridView完整实现
1. 先修复SQL注入风险(关键!)
你之前用字符串拼接SQL的写法存在SQL注入风险,换成参数化查询才是安全规范的做法,而且OleDb的参数是按位置匹配的,注意写法:
// 假设con是你已初始化的OleDbConnection实例 private void FillDataGridViewFromPO() { // 先判断是否选中了订单 string orderNumber = lbOrders.SelectedItem?.ToString() ?? string.Empty; if (string.IsNullOrWhiteSpace(orderNumber)) { MessageBox.Show("请先选择一个采购订单哦"); return; } try { using (con) { con.Open(); // 参数化查询,用?作为占位符 string query = "SELECT PartNumber FROM PurchaseOrders WHERE PONumber LIKE ?"; using (OleDbCommand cmd = new OleDbCommand(query, con)) { // 按位置添加参数,值里保留通配符% cmd.Parameters.AddWithValue("@PONumber", $"%{orderNumber}%");
2. 填充DataGridView的两种实用方式
方式一:用OleDbDataReader手动逐行填充
适合需要逐行处理数据的场景:
using (OleDbDataReader reader = cmd.ExecuteReader()) { // 先清空现有数据 dataGridView1.Rows.Clear(); dataGridView1.Columns.Clear(); // 根据查询结果自动生成列 for (int i = 0; i < reader.FieldCount; i++) { dataGridView1.Columns.Add(reader.GetName(i), reader.GetName(i)); } // 逐行读取数据并添加到表格 while (reader.Read()) { object[] rowData = new object[reader.FieldCount]; reader.GetValues(rowData); dataGridView1.Rows.Add(rowData); } }
方式二:用DataTable绑定(更简洁,推荐)
这种方式支持DataGridView的所有数据绑定特性,比如排序、筛选,代码更简洁:
using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd)) { DataTable poTable = new DataTable(); adapter.Fill(poTable); // 直接绑定数据源,自动生成列 dataGridView1.DataSource = poTable; // 如果需要自定义列(比如修改列名),可以先关闭自动生成列再手动添加 // dataGridView1.AutoGenerateColumns = false; // dataGridView1.Columns.Add("PartNumberCol", "零件编号").DataPropertyName = "PartNumber"; }
3. 绑定列表选择事件触发填充
最后要给左侧的lbOrders(采购订单列表)添加选择变更事件,这样用户一点击列表就自动填充数据:
} } } catch (OleDbException ex) { MessageBox.Show($"数据库查询出错:{ex.Message}"); } catch (Exception ex) { MessageBox.Show($"发生错误:{ex.Message}"); } finally { // 确保数据库连接关闭 if (con?.State == ConnectionState.Open) { con.Close(); } } } // 给lbOrders的SelectedIndexChanged事件绑定方法 private void lbOrders_SelectedIndexChanged(object sender, EventArgs e) { FillDataGridViewFromPO(); }
额外小提示
- 如果你的
PurchaseOrders表还有其他字段(比如采购日期、供应商、数量等),只需要修改SQL语句为SELECT * FROM ...或者指定需要的字段,DataGridView会自动适配显示; - 用
using语句包裹数据库相关对象,可以自动释放资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Brett Byrd
相关产品推荐
相关产品推荐

