如何用C#查询SQL数据库,仅展示登录用户的历史支出记录?
解决方案
首先得确认你的ExpensesTbl里有能关联到用户的字段——比如UserName(存储登录用户名)或者UserID(推荐用这个,因为用户名可能被修改),这是实现用户数据隔离的前提。
核心逻辑
给SQL语句添加WHERE子句筛选当前登录用户的记录,但一定要用参数化查询,绝对不能直接把用户名拼进SQL字符串里,否则会引发严重的SQL注入漏洞。
具体实现步骤
- 登录后保存用户标识
登录验证通过后,把当前用户的用户名(或用户ID)存储起来,比如放到Session中:
// 假设登录时已验证通过,拿到合法的userName Session["CurrentUserName"] = userName;
- 编写参数化查询代码
从存储的用户标识中取值,作为参数传入SQL语句:
// 获取当前登录用户的用户名 string currentUserName = Session["CurrentUserName"].ToString(); // 构建参数化SQL语句 string sqlQuery = "SELECT * FROM ExpensesTbl WHERE UserName = @UserName"; // 数据库连接操作示例(使用SqlClient) using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) { conn.Open(); using (SqlCommand cmd = new SqlCommand(sqlQuery, conn)) { // 添加参数,避免SQL注入风险 cmd.Parameters.AddWithValue("@UserName", currentUserName); // 执行查询并读取结果 using (SqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { // 处理当前用户的每条支出记录 // 示例:读取支出金额和日期 decimal amount = reader.GetDecimal(reader.GetOrdinal("Amount")); DateTime expenseDate = reader.GetDateTime(reader.GetOrdinal("ExpenseDate")); // 其他字段按需处理 } } } }
更稳妥的UserID关联方案
如果你的系统有独立的用户表(比如UsersTbl),里面有唯一的UserID字段,那么ExpensesTbl最好用UserID关联用户,比用户名更稳定:
// 登录时从用户表查询到当前用户的ID并存入Session int currentUserId = 123; // 实际值从数据库查询获取 Session["CurrentUserId"] = currentUserId; // 对应的参数化SQL语句 string sqlQuery = "SELECT * FROM ExpensesTbl WHERE UserID = @UserID"; // 传入参数 cmd.Parameters.AddWithValue("@UserID", currentUserId);
关键注意事项
- 绝对禁止直接拼接SQL字符串,比如
"SELECT * FROM ExpensesTbl WHERE UserName = '" + currentUserName + "'"——这种写法会被黑客利用SQL注入攻击,窃取或篡改数据库数据。 - 确认
ExpensesTbl中的关联字段与登录用户的标识完全匹配,注意数据库的大小写敏感设置(比如SQL Server默认不区分,MySQL可能区分),避免出现查询不到数据的情况。
内容的提问来源于stack exchange,提问作者Joseph OConnell
相关产品推荐
相关产品推荐

