You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取SqlDataReader时无法更新数据表,如何通过ID实现更新?

问题分析与解决方案

核心错误

你第一个查询用了Select Count(*),所以sdr[0]拿到的是符合条件的用户数量,不是用户的Idutilizatori!用这个数值作为Update的where IdUtilizatori='xxx'条件,自然找不到对应记录,更新就没效果。

正确实现步骤

  1. 修正登录验证查询:查询用户的Idutilizatori(而非计数),验证登录的同时获取用户ID
  2. 全程使用参数化查询:避免SQL注入,同时解决日期格式不兼容的问题
  3. 确保更新语句的条件正确:用拿到的用户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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:52:47