如何从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.N | ID | Name | book | date |
|---|---|---|---|---|
| 1 | 10 | John | - | - |
| 2 | 20 | Joe | book1 | 03 |
| 3 | 30 | User3 | book2 | 05 |
完全符合你要的格式——所有学生都显示,无匹配的列用-填充,还有序号列。
内容的提问来源于stack exchange,提问作者Pradip Dhakal
相关产品推荐
相关产品推荐

