c# - SQL Server 验证返回错误的输出

标签 c# asp.net sql-server

我正在使用 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/

相关文章:

c# - 在 Metro 中等待一个线程完成

sql-server - SQL 服务器 : why are sizes of different backups the same?

c# - 函数返回的字符串

c# - 在组合框中保存值和文本

asp.net - SITE 的 IIS 配置编辑器部分缺少 http压缩

c# - .NET Web 应用程序 native 使用多少个线程?

mysql - SQL 查询 - C# 数据库连接 (DataGrid)

sql-server - CRLF 序列作为存储过程中的默认参数值

c# - C#通过发布请求发送Cookie

c# - 奇怪的 DropDownListFor/SelectListItem 问题未设置默认值