C#多表查询问题:添加第二张表后查询返回空结果
问题分析与解决办法
你的代码出现空结果,核心问题和修正方案如下:
问题点
- 多结果集无法用单个DataTable接收:你写了两个
SELECT语句(多结果集查询),但DataTable只能存储一个查询结果,第二个表的数据根本没被填充到表里。如果第一个表没匹配到内容,就会显示空结果。 - 无效的DataTable构造参数:
DataTable的构造函数参数是单个表名,你传Uniclass2015_EF_v1_12; Uniclass2015_En_v1_26这种多表名组合完全不起作用。 - 冗余参数:代码里添加了
@code参数,但SQL语句中根本没用到它,属于多余代码。
修正方案
方案1:合并结果集(表结构一致时用)
如果两个表的字段结构完全相同(比如都有title等相同字段),可以用UNION ALL把两个表的查询结果合并成一个,用单个DataTable接收即可:
using (DataTable dt = new DataTable()) { using (SqlCommand cmd = new SqlCommand(@" SELECT * FROM Uniclass2015_En_v1_26 WHERE title LIKE @Title UNION ALL SELECT * FROM Uniclass2015_EF_v1_12 WHERE title LIKE @Title ", conn)) { cmd.Parameters.AddWithValue("@Title", $"%{txtSearch.Text}%"); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(dt); dataGridView1.DataSource = dt; } } conn.Close();
方案2:保留独立结果集(表结构不同时用)
如果两个表结构不一样,需要分别保留各自的结果,就用DataSet来存储多个DataTable:
using (DataSet ds = new DataSet()) { using (SqlCommand cmd = new SqlCommand(@" SELECT * FROM Uniclass2015_En_v1_26 WHERE title LIKE @Title; SELECT * FROM Uniclass2015_EF_v1_12 WHERE title LIKE @Title ", conn)) { cmd.Parameters.AddWithValue("@Title", $"%{txtSearch.Text}%"); SqlDataAdapter adapter = new SqlDataAdapter(cmd); // Fill会自动把多个结果集填充到DataSet的不同DataTable中 adapter.Fill(ds); // 可选择显示第一个表或第二个表 dataGridView1.DataSource = ds.Tables[0]; // 或者切换显示第二个表:dataGridView1.DataSource = ds.Tables[1]; } } conn.Close();
另外,你写的txtSearch_KeyPress事件代码没有问题,无需修改。
内容的提问来源于stack exchange,提问作者Eduard Szigeti
相关产品推荐
相关产品推荐

