我正在使用 SQL Server 在本地服务器上验证登录页面。我创建了登录页面和注册页面,我的注册页面工作正常,但登录页面一直显示“用户未激活”错误
这是我的登录页面背后的代码
public partial class Login : System.Web.UI.Page
{
protected void Validate_User(object sender, EventArgs e)
{
int userId = 0;
string constr = `ConfigurationManager.ConnectionStrings["constr"].ConnectionString;`
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("Validate_User"))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Username", Login1.UserName);
cmd.Parameters.AddWithValue("@Password", Login1.Password);
cmd.Connection = con;
con.Open();
userId = Convert.ToInt32(cmd.ExecuteScalar());
con.Close();
}
switch (userId)
{
case -1:
Login1.FailureText = "Username and/or password is incorrect.";
break;
case -2:
Login1.FailureText = "Account has not been activated.";
break;
default:
FormsAuthentication.RedirectFromLoginPage(Login1.UserName, Login1.RememberMeSet);
break;
}
}
}
}
这是验证用户的过程
CREATE PROCEDURE [dbo].[Validate_User]
@Username NCHAR(50),
@Password VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @UserId INT, @LastLoginDate DATETIME
SELECT @UserId = UserId, @LastLoginDate = LastLoginDate
FROM NervSuiteUsers
WHERE Username = @UserName AND [Password] = @Password
IF @UserId IS NOT NULL
BEGIN
IF NOT EXISTS(SELECT UserId FROM NervSuiteUsers WHERE Username = @UserName)
BEGIN
UPDATE NervSuiteUsers
SET LastLoginDate = GETDATE()
WHERE UserId = @UserId
SELECT @UserName [UserName] -- User Valid
END
ELSE
BEGIN
SELECT -2 -- User not activated.
END
END
ELSE
BEGIN
SELECT -1 -- User invalid.
END
END
问题是即使数据库中有一个用户,我仍然得到“帐户未验证”
最佳答案
除了 SP 中的故障(已经讨论过)之外,.NET 代码中还有问题,与结果是整数(失败)还是字符串(成功)相关。解决这个问题的一种实用方法是始终返回相同的类型。由于用户将用户名传入,因此将其再次传出不一定有很大意义,除非您的意图是自动更正不区分大小写的字符串,但是 简单 解决方法是在成功案例中简单地选择 1
(或其他一些标记值),而不是 select @UserName
。
但是,同样的问题可以在现有代码中修复,只需测试该值:
object sqlResult = cmd.ExecuteScalar();
switch (sqlResult)
{
case int i when i == -1:
// TODO ...
break;
case int i when i == -2:
// TODO ...
break;
case string s:
// success, and the value was s
// TODO...
break;
default:
// I HAVE NO CLUE
throw new SomeSensibleException(...);
}
请注意,这使用“新的”C# 语言语法功能,但如果您使用的是下层 C#,也可以通过以下方式手动完成相同的基本方法:
if (sqlResult is int)
{
switch ((int)sqlResult)
{
// ...
}
}
else if (sqlResult is string)
{
string s = (string)sqlResult;
// ...
}
关于c# - SQL Server 验证返回错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54401505/