如何在ASP.NET WebForms中对比SQL Server存储过程的输出参数?
问题解决:SqlParameter无法调用GetInt32方法的错误
错误的核心原因是:GetInt32是SqlDataReader类的方法,SqlParameter对象并没有这个方法,你需要通过SqlParameter.Value属性获取存储过程返回的输出参数值,再转换为整数类型。
修正后的后台代码
protected void login(object sender, EventArgs e) { String connstr = WebConfigurationManager.ConnectionStrings["Sports"].ToString(); // 使用using语句自动释放连接,避免资源泄漏 using (SqlConnection conn = new SqlConnection(connstr)) { String username = txt_Username.Text; String password = txt_password.Text; // 注意:存储过程定义名为Login,需与代码中调用的名称保持一致 SqlCommand loginCmd = new SqlCommand("Login", conn); loginCmd.CommandType = CommandType.StoredProcedure; loginCmd.Parameters.Add(new SqlParameter("@username", username)); loginCmd.Parameters.Add(new SqlParameter("@password", password)); SqlParameter loginstatus = loginCmd.Parameters.Add("@status", SqlDbType.Int); loginstatus.Direction = ParameterDirection.Output; conn.Open(); loginCmd.ExecuteNonQuery(); conn.Close(); // 获取输出参数值并转换为int,先判断是否为DBNull避免转换异常 int status = loginstatus.Value != DBNull.Value ? (int)loginstatus.Value : 0; if (status == 1) { Response.Write("hello"); Response.Redirect("Home.aspx"); } } }
额外注意事项
- 存储过程名称一致性:你的存储过程定义为
Login,但原代码中调用的是userLogin,名称必须完全匹配,否则会出现找不到存储过程的错误。 - 资源安全:用
using语句包裹SqlConnection,可确保连接在代码块结束后自动释放,避免数据库连接泄漏。 - 密码安全:当前代码和存储过程直接使用明文密码验证,存在严重安全风险,建议对密码进行哈希处理(如SHA256),存储哈希值而非明文。
内容的提问来源于stack exchange,提问作者Ahmed Haitham
相关产品推荐
相关产品推荐

