You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:00:22