读取SqlDataReader时无法更新数据表,如何通过ID实现更新?
问题分析与解决方案
核心错误
你第一个查询用了Select Count(*),所以sdr[0]拿到的是符合条件的用户数量,不是用户的Idutilizatori!用这个数值作为Update的where IdUtilizatori='xxx'条件,自然找不到对应记录,更新就没效果。
正确实现步骤
- 修正登录验证查询:查询用户的
Idutilizatori(而非计数),验证登录的同时获取用户ID - 全程使用参数化查询:避免SQL注入,同时解决日期格式不兼容的问题
- 确保更新语句的条件正确:用拿到的用户ID作为更新条件
完整代码示例
// 1. 修正登录查询:获取用户ID而非计数 string loginSql = "SELECT Idutilizatori FROM Utilizatori WHERE NumeUtilizator = @username AND Parola = @password"; using (SqlCommand cmd = new SqlCommand(loginSql, conn)) { // 添加参数,避免SQL注入 cmd.Parameters.AddWithValue("@username", usermailtxt.Text); cmd.Parameters.AddWithValue("@password", passtxt.Text); using (SqlDataReader sdr = cmd.ExecuteReader()) { // 如果读取到数据,说明登录成功 if (sdr.Read()) { // 获取用户ID int userId = Convert.ToInt32(sdr["Idutilizatori"]); DateTime lastLoginTime = DateTime.Now; // 2. 更新最后登录时间,用参数化查询 string updateSql = "UPDATE Utilizatori SET UltimaUtilizare = @lastLogin WHERE Idutilizatori = @userId"; using (SqlCommand updateCmd = new SqlCommand(updateSql, conn)) { // 关闭之前的DataReader,否则同一连接无法执行新命令 sdr.Close(); updateCmd.Parameters.AddWithValue("@lastLogin", lastLoginTime); updateCmd.Parameters.AddWithValue("@userId", userId); // 执行更新并检查影响行数 int affectedRows = updateCmd.ExecuteNonQuery(); // 可选:打印affectedRows确认是否更新成功 // Console.WriteLine($"更新了 {affectedRows} 条记录"); } } } }
额外注意点
- 必须关闭
SqlDataReader后,才能在同一连接上执行新的ExecuteNonQuery,否则会报错 - 永远不要直接拼接字符串到SQL语句中,不仅会导致SQL注入,还会出现日期/字符串格式不兼容的问题
- 可以通过
ExecuteNonQuery()的返回值判断是否有记录被更新,返回值为0说明没有匹配的记录
内容的提问来源于stack exchange,提问作者xpl0d
相关产品推荐
相关产品推荐

