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
相关产品推荐
相关产品推荐

