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

如何从MS Access两个表取数据并合并显示在DataGridView中

解决Access表合并到DataGridView的问题

嘿,我来帮你搞定这个需求!要把student和library表的数据合并成你要的格式,关键是用**左连接(LEFT JOIN)**保留所有学生记录,再处理空值显示-,最后绑定到DataGridView并添加序号列。

第一步:写对Access的SQL查询

因为你要保留所有学生的信息,哪怕他们没有借阅记录,所以必须用LEFT JOIN关联两个表。Access里有个很方便的NZ()函数,可以直接把空值替换成指定内容,比嵌套IIF更简洁:

SELECT 
    student.ID,
    student.Name,
    NZ(library.book, '-') AS book,
    NZ(library.date, '-') AS date
FROM student
LEFT JOIN library ON student.ID = library.s_ID

如果你的Access版本比较旧,不支持NZ(),可以用IIF+ISNULL替代:

SELECT 
    student.ID,
    student.Name,
    IIF(ISNULL(library.book), '-', library.book) AS book,
    IIF(ISNULL(library.date), '-', library.date) AS date
FROM student
LEFT JOIN library ON student.ID = library.s_ID

这个查询会返回所有学生,没有借阅记录的book和date列自动显示-,完美匹配你的要求。

第二步:在WinForms中绑定数据到DataGridView

假设你用的是C# WinForms,下面是完整的实现步骤:

先引入必要的命名空间

using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;

编写加载数据的方法

private void LoadMergedData()
{
    // 记得替换成你自己的Access数据库路径
    string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\YourDatabase.accdb;";
    
    using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
        string sql = @"
            SELECT 
                student.ID,
                student.Name,
                NZ(library.book, '-') AS book,
                NZ(library.date, '-') AS date
            FROM student
            LEFT JOIN library ON student.ID = library.s_ID
        ";
        
        OleDbDataAdapter adapter = new OleDbDataAdapter(sql, conn);
        DataTable dt = new DataTable();
        
        try
        {
            conn.Open();
            adapter.Fill(dt);
            
            // 把数据绑定到DataGridView
            dataGridView1.DataSource = dt;
            
            // 添加序号列(S.N)
            var serialCol = new DataGridViewTextBoxColumn
            {
                Name = "S.N",
                HeaderText = "S.N",
                ReadOnly = true,
                AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells
            };
            dataGridView1.Columns.Insert(0, serialCol);
            
            // 填充序号值
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if (!row.IsNewRow)
                {
                    row.Cells["S.N"].Value = row.Index + 1;
                }
            }
            
            // 调整列标题(可选,确保和你要的一致)
            dataGridView1.Columns["ID"].HeaderText = "ID";
            dataGridView1.Columns["Name"].HeaderText = "Name";
        }
        catch (Exception ex)
        {
            MessageBox.Show($"加载数据出错啦:{ex.Message}");
        }
    }
}

在窗体加载时调用方法

把这个方法放到窗体的Load事件里,打开窗体就自动加载数据:

private void YourForm_Load(object sender, EventArgs e)
{
    LoadMergedData();
}

最终效果

运行后,你的DataGridView会显示成这样:

S.NIDNamebookdate
110John--
220Joebook103
330User3book205

完全符合你要的格式——所有学生都显示,无匹配的列用-填充,还有序号列。

内容的提问来源于stack exchange,提问作者Pradip Dhakal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:26:52