ASP.NET(C#)中检查SQL Server表用户评分列是否为空的实现问题
问题修正方案
现有代码核心问题梳理
- 原查询SQL缺
bookTitle过滤条件:评分表主键是(bookTitle, userID),仅按用户ID查询会拿到该用户所有书籍的评分,无法匹配当前页面展示的书籍 - 直接拼接SQL字符串存在SQL注入风险,必须改用参数化查询
- INSERT语句语法错误:INSERT语句不支持WHERE子句,且缺失必填的
bookTitle、userID字段赋值 - 原有逻辑结构颠倒:应该先执行查询,再根据是否查到记录判断走展示还是提交逻辑
正确逻辑实现
首先你需要先拿到当前页面展示的书籍名称,假设存储在变量currentBookTitle中,修正后的代码如下:
// 注意用using包裹连接对象,执行完自动释放资源 using (SqlConnection ratingconn = new SqlConnection("你的数据库连接字符串")) { ratingconn.Open(); // 参数化查询避免SQL注入,同时增加书籍维度的过滤 SqlCommand cmdCheck = ratingconn.CreateCommand(); cmdCheck.CommandText = "SELECT bookRating FROM tbl_ratingInfo WHERE userID = @UserID AND bookTitle = @BookTitle"; // 绑定查询参数 cmdCheck.Parameters.AddWithValue("@UserID", Session["userID"]); cmdCheck.Parameters.AddWithValue("@BookTitle", currentBookTitle); // 替换为你的当前页面书籍名称变量 SqlDataReader reader = cmdCheck.ExecuteReader(); // 这里就是你需要的判断逻辑:reader.Read()返回true说明查到了对应记录,即用户已评分 if (reader.Read()) { // 已评分,禁用下拉框展示已有评分 ddl_Rating.Enabled = false; ddl_Rating.Text = reader.GetInt32(0).ToString(); reader.Close(); } else { // 未评分,提交逻辑建议绑定到用户点击「提交评分」按钮的事件中,不要页面加载就直接执行插入 reader.Close(); // 以下是提交按钮触发时的插入逻辑 SqlCommand cmdRating = ratingconn.CreateCommand(); cmdRating.CommandText = "INSERT INTO tbl_ratingInfo (bookTitle, userID, bookRating) VALUES(@BookTitle, @UserID, @Rating)"; cmdRating.Parameters.AddWithValue("@BookTitle", currentBookTitle); cmdRating.Parameters.AddWithValue("@UserID", Session["userID"]); cmdRating.Parameters.AddWithValue("@Rating", ddl_Rating.Text); cmdRating.ExecuteNonQuery(); // 插入成功后禁用下拉框提示提交完成 ddl_Rating.Enabled = false; } }
额外注意事项
- 所有数据库操作相关的连接、命令、读取器对象都建议用
using包裹,自动释放资源避免内存泄漏 - 评分表的
CHECK约束目前只限制了bookRating <=5,建议补充bookRating >=1的规则,避免非法分值写入 - 如果需要支持用户修改已有评分,可以将插入逻辑替换为
MERGE语句,实现存在则更新、不存在则插入的效果
内容的提问来源于stack exchange,提问作者Ankia LeRoux
相关产品推荐
相关产品推荐

