【问题标题】:Checking for user existence in SQL Server table在 SQL Server 表中检查用户是否存在
【发布时间】:2015-07-21 22:03:37
【问题描述】:

我需要创建一个类,其中包含用于通过登录控件为用户检查 SQL Server 表的逻辑。当我运行我的代码并在登录控件中输入数据时,它无法识别用户并写入错误消息。有人可以查看我的代码是否有错误吗?

这是课程代码:

public int checkUser (string Username, string Password)
{
        using (SqlConnection sqlCnn = new SqlConnection(cnn))
        {
            Int32 count = 0;
            string sqlQuery = "SELECT COUNT(*) AS LoginInfo FROM users" +
                "WHERE Username = @Name AND Password = @Password";
            //sqlCnn.Open();

            using (SqlCommand comm = new SqlCommand(sqlQuery, sqlCnn))
            {
                //comm.Parameters.AddWithValue("@Name", Username);
                //comm.Parameters.AddWithValue("@Password", Password);
                comm.Parameters.Add("@Name", SqlDbType.NChar).Value = Username;
                comm.Parameters.Add("@Password", SqlDbType.NChar).Value = Password;

                try
                {
                    sqlCnn.Open();
                    count = (Int32)comm.ExecuteScalar();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error");
                }
                finally
                {
                    sqlCnn.Close();
                }

                return (Int32)count;
        }
    }
}

这是实现代码:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
        User1 user = new User1();

        string name = Login1.UserName;
        string pass = Login1.Password;

        if (user.checkUser(name, pass) > 0)
        {
            Response.Redirect("mainPage.aspx");
        }
        else
        {
            Label1.Text = "Error";

        }
}

【问题讨论】:

  • 您是否调试过您的代码以及checkUser 方法究竟返回了什么?
  • 尝试直接在SSMS上运行查询,看看结果如何。可能存在一些空白问题。
  • 请告诉我们您不是真的纯文本格式存储密码!
  • 我是初学者,这是我的练习项目,我想先让这个工作,然后我会尝试更改通行证存储。
  • checkUser 方法应该接受两个值,username 和 pass 并检查该数据是否存在于 users 表中。

标签: c# sql asp.net sqlcommand


【解决方案1】:

你的查询字符串应该是错误的:

SELECT COUNT(*) AS LoginInfo FROM usersWHERE Username = @Name AND Password = @Password

这可能是导致异常的原因。

我总是使用verbatim string literal,以便更容易复制查询,并且您不必考虑以空格结束或开始每个字符串:

string sqlQuery = @"SELECT COUNT(*) AS LoginInfo FROM users 
            WHERE Username = @Name AND Password = @Password";

而不仅仅是 Console.WriteLine("Error");您可能应该编写异常:

catch (Exception ex)
{
    Console.WriteLine(ex.Message);
    Console.WriteLine(ex.StackTrace); //probably a good idea
}

如果 InnerException 不为空,您也可以查看它。

我发现您的变量 UsernamePassword 中有大写字母。您应该将第一个字符更改为小写。 我也总是使用 AddWithValue

comm.Parameters.AddWithValue("@Name", username);

【讨论】:

  • 我按照你的建议做了,但不幸的是仍然存在同样的问题。我输入用户名并输入登录名,它在控件“错误”下方写入,就像该用户不存在于表中一样。
  • 如果您没有将异常记录到程序中,您需要调试项目并在 catch 中设置断点。您应该在控制台中遇到异常,这是了解问题的真正第一步。如果你在这方面遇到困难,你可能需要学习一门课程或阅读一本带有示例的书,这样你至少有关于调试的基本知识。
  • 当我在 catch 中设置断点时出现异常,它显示:“Exception:Caught:”连接未关闭。连接的当前状态是打开的。” (System.InvalidOperationException) 捕获到 System.InvalidOperationException:“连接未关闭。连接的当前状态是打开的。" ."
  • 好吧,如果您之前检查过异常,这可能是您最初的问题。现在,如果您检查 stackoverflow,您可能会发现可以帮助您解决此错误的内容。也许这可能会解决您的问题:stackoverflow.com/questions/11053731/…
  • 尝试了他们的建议,但仍然一无所获..我显然需要考虑其他一些方法来做到这一点..
【解决方案2】:

好的,我找到了问题的解决方案。第一个错误是在 sql 查询中。 我不应该转发该类作为值接受的数据( Username = @Name ==> name = @Name )。 其次,在实现代码中必须添加另一行,以便重定向能够将批准的用户转移到另一个页面:

FormsAuthentication.RedirectFromLoginPage(name, true);

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多