我正在登录页面上使用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
问题是即使数据库中有一个用户,我仍然会收到“未验证帐户”
答案 0 :(得分:3)
除了SP中的故障(已经讨论过)之外,.NET代码中还存在问题,与结果是整数(失败)还是字符串(成功)相关。解决此问题的一种实用方法是始终返回相同的类型。由于用户将用户名输入 in ,所以再次传递 不一定有什么意义,除非您的意图是自动更正不区分大小写的字符串,而是解决方法>简单是在成功的情况下仅使用select 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;
// ...
}
答案 1 :(得分:1)
您的SP向我提出了矛盾的声明。仅当两个用户名/密码都匹配时,下面的查询才会给出结果
SELECT @UserId = UserId, @LastLoginDate = LastLoginDate
FROM NervSuiteUsers
WHERE Username = @UserName AND [Password] = @Password
然后下面的查询毫无意义
IF @UserId IS NOT NULL // will be true when both username/password matches
BEGIN
IF NOT EXISTS(SELECT UserId FROM NervSuiteUsers WHERE Username = @UserName) // Why this???? This will not be TRUE
BEGIN
UPDATE NervSuiteUsers
SET LastLoginDate = GETDATE()
WHERE UserId = @UserId
因此,您的else
区块将得到评估,您将获得发布的结果
ELSE
BEGIN
SELECT -2 -- User not activated.
END
答案 2 :(得分:1)
除了您收到有关实施问题的评论的所有反馈之外,您还有以下几行查询的问题。
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
它不应为NOT EXISTS
。它应该为IF EXISTS
,因为@UserId
NOT NULL表示它存在于表中,请按如下所示更改查询。
IF 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