C#对接MS Access数据库无法筛选当前登录学生用户记录如何解决
解决方案
1. 存储当前登录用户ID
登录成功后,需要把当前登录的学生ID(即你登录时输入的用户名,对应表中s_id字段)存储在可被数据展示模块访问的位置,示例如下:
// 示例:公共类中定义全局静态变量存储登录用户信息 public static class LoginInfo { // 登录验证通过后,将当前用户的s_id赋值给该字段,比如你测试时输入的用户名50就赋值为50 public static int CurrentUserId; }
如果你是从登录窗体跳转到数据展示窗体,也可以通过窗体构造函数直接传递用户ID,无需使用全局静态变量。
2. 修改查询代码,增加过滤条件
原有SQL语句没有加筛选条件,所以会返回所有学生的关联数据,我们需要新增WHERE条件过滤当前用户,同时使用参数化查询避免SQL注入风险,修改后代码如下:
conn.Open(); // 新增WHERE条件,OleDb使用?作为参数占位符 string querySql = @"SELECT student.s_id, student.f_name, student.l_name, student.email, student.address, course.c_id, course.cname, resultdate.resultgrade FROM ((student INNER JOIN resultdate ON student.s_id = resultdate.s_id) INNER JOIN course ON resultdate.c_id = course.c_id) WHERE student.s_id = ?"; OleDbDataAdapter sda = new OleDbDataAdapter(querySql, conn); // 为SQL添加参数,参数值为之前存储的当前登录用户ID sda.SelectCommand.Parameters.AddWithValue("?", LoginInfo.CurrentUserId); DataTable dt = new DataTable(); sda.Fill(dt); dataGridView1.DataSource = dt; conn.Close();
注:原有代码中定义的
OleDbCommand cmd没有被实际使用,可以直接删除减少冗余。
注意事项
- 如果你的
s_id字段是字符串类型,存储用户ID和参数赋值时要对应改为字符串类型,保证和数据库字段类型匹配 - OleDb参数是按顺序匹配的,如果你后续需要新增多个过滤条件,要保证添加参数的顺序和SQL中
?占位符的出现顺序完全一致
内容的提问来源于stack exchange,提问作者Muhammad Fayzan
相关产品推荐
相关产品推荐

