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

C#与SQL Server简单更新查询触发Win32Exception等待超时错误

问题分析与修复方案

核心原因:数据库连接未正确释放,导致连接池耗尽

验证页面的后台代码中,SqlDataReader和SqlConnection未被正确关闭或释放,长期运行会耗尽数据库连接池,后续请求无法获取可用连接,最终触发超时错误。

1. 修复验证页面的数据库操作代码

原代码未释放数据库资源,修改为使用using语句自动管理连接、命令和数据读取器:

protected void SubmitButton_Click(object sender, EventArgs e)
{
    string email = Email.Text;
    string user = UserName.Text;
    string question = Question.Text;
    string answer = Answer.Text;

    string strCon = ConfigurationManager.ConnectionStrings["WebConfigConString"].ConnectionString;

    // using块会自动释放资源,无需手动关闭
    using (SqlConnection con = new SqlConnection(strCon))
    {
        con.Open();
        string strCheck = "SELECT * FROM ACCOUNT WHERE ID = @id AND EMAIL = @email AND SECURITYQUESTION = @question AND SECURITYANSWER = @answer";
        using (SqlCommand cmdCheck = new SqlCommand(strCheck, con))
        {
            cmdCheck.Parameters.AddWithValue("@id", user);
            cmdCheck.Parameters.AddWithValue("@question", question);
            cmdCheck.Parameters.AddWithValue("@email", email);
            cmdCheck.Parameters.AddWithValue("@answer", answer);

            using (SqlDataReader dtrCheck = cmdCheck.ExecuteReader())
            {
                if (dtrCheck.HasRows)
                {
                    Response.Redirect("newPassword.aspx?id=" + user);
                }
                else
                {
                    ErrorMsg.Text = "用户名或邮箱无效 / 安全问题与答案不匹配!";
                }
            }
        }
    }
}

2. 优化新密码页面的数据库操作代码

移除冗余的con.Close()(using块会自动关闭连接),同时必须对密码进行哈希存储(明文存密码是严重安全漏洞):

protected void SubmitButton_Click(object sender, EventArgs e)
{
    // 先验证前端校验是否通过
    if (!Page.IsValid) return;

    string id = Request.QueryString["id"];
    string password = Password.Text;

    // 对密码进行哈希处理(示例用SHA256,实际建议用BCrypt/Argon2等加盐哈希算法)
    using (var sha256 = System.Security.Cryptography.SHA256.Create())
    {
        byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password);
        string hashedPassword = Convert.ToBase64String(sha256.ComputeHash(passwordBytes));

        string strCon = ConfigurationManager.ConnectionStrings["WebConfigConString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(strCon))
        {
            con.Open();
            string strChange = "UPDATE ACCOUNT SET PASSWORD = @password WHERE ID = @id";
            using (SqlCommand cmdChange = new SqlCommand(strChange, con))
            {
                cmdChange.Parameters.AddWithValue("@id", id);
                cmdChange.Parameters.AddWithValue("@password", hashedPassword);

                int affectedRows = cmdChange.ExecuteNonQuery();
                // 验证更新是否成功,防止ID被篡改
                if (affectedRows > 0)
                {
                    Response.Redirect("login.aspx?msg=密码更新成功!");
                }
                else
                {
                    ErrorMsg.Text = "无效的用户ID,请重新操作!";
                }
            }
        }
    }
}

3. 额外配置与安全建议

  • 调整数据库连接超时:在Web.config的连接字符串中添加Connect Timeout=15(根据实际情况调整时长):
<connectionStrings>
    <add name="WebConfigConString" connectionString="Data Source=你的数据源;Initial Catalog=你的数据库;User ID=账号;Password=密码;Connect Timeout=15" providerName="System.Data.SqlClient"/>
</connectionStrings>
  • 对Request.QueryString["id"]做合法性校验,防止非法篡改或注入。
  • 禁止明文存储密码,必须使用加盐哈希算法(如BCrypt),避免密码泄露风险。

错误提示翻译:System.ComponentModel.Win32Exception: 等待操作超时

内容的提问来源于stack exchange,提问作者YUNG FOOK YONG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:30:54