【问题标题】:Admin and User checking not working管理员和用户检查不起作用
【发布时间】:2015-06-22 16:11:55
【问题描述】:

我有一个名为 Logins 的数据库表,它有 3 列:Username、Password 和 Category。类别有两种类型:Admin 和 User。

我有一个带有两个文本框的表单,用户将在其中写下他的用户名和密码。使用用户名文本框输入,我想检查给定的用户名是Admin 还是User,并在此基础上打开不同的表单。

我收到以下错误:

意外错误:"'" 附近的语法不正确

SqlConnection con = new SqlConnection("Data Source=JAYI-PC\\SQLEXPRESS;Initial Catalog=db-ub;Integrated Security=True");
try
{
    con.Open();
    SqlCommand cmd = new SqlCommand(@"SELECT Count(*) FROM Logins
                            WHERE Username=@uname and
                            Password=@pass,Category=@ctgy", con);
    cmd.Parameters.AddWithValue("@uname", textBox_usern.Text);
    cmd.Parameters.AddWithValue("@pass", textBox_pwd.Text);
    cmd.Parameters.AddWithValue("@ctgy", c); //Can't understand how to check it

    int result = (int)cmd.ExecuteScalar();

    if (result > 0)
    {
        if (c== "Admin")//this one will chek whether user is admin or user
        {
            MessageBox.Show("Welcome Admin");
            Admin f1 = new Admin();
            f1.Show();
        }

        else
        {
            MessageBox.Show("Welcome " + textBox_usern.Text);
            FormCheck f3 = new FormCheck();
            f3.Show();
        }
    }

    else
    {
        MessageBox.Show("Incorrect login");
    }
    textBox_usern.Clear();
    textBox_pwd.Clear();

}
catch (Exception ex)
{
    MessageBox.Show("Unexpected error:" + ex.Message);
}

【问题讨论】:

  • 您是否以纯文本形式存储密码?请不要那样做。
  • MAV 是初学者。那我该怎么办?请帮忙
  • @JayitaRoy 你从哪里分配 C 的值?
  • 删除 Category=@ctgy 和 cmd.Parameters.AddWithValue("@ctgy", c);。您不是根据category 选择的,您需要通过username 和pass 获取它。选择仅使用username 和pass 后,检查该行是category == "Admin" 还是"User"。
  • Sachu 问题是我不明白如何处理 Category=@ctgy

标签: c# sql .net


【解决方案1】:

您的查询不正确,它漏掉了一个and 并有多余的,。应该是这样的

SELECT Count(*) FROM Logins
WHERE Username=@uname and
Password=@pass and Category=@ctgy

【讨论】:

  • 谢谢,但我认为我对@ctgy 的价值也做错了。如何检查它并获得正确的值。看不懂
  • @JayitaRoy 你在哪里定义c?我们不知道您如何检查用户是管理员还是用户。
【解决方案2】:

我相信您正在尝试阅读类别将您的查询更改为此

SqlCommand cmd = new SqlCommand(@"SELECT Category FROM Logins
                            WHERE Username=@uname and
                            Password=@pass", con);
cmd.Parameters.AddWithValue("@uname", textBox_usern.Text);
cmd.Parameters.AddWithValue("@pass", textBox_pwd.Text);

SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
var c = reader["Category"].ToString();
   if (c== "Admin")//this one will chek whether user is admin or user
    {
        MessageBox.Show("Welcome Admin");
        Admin f1 = new Admin();
        f1.Show();
    }

    else
    {
        MessageBox.Show("Welcome " + textBox_usern.Text);
        FormCheck f3 = new FormCheck();
        f3.Show();
    }
}
else
{
    MessageBox.Show("Incorrect login");
}
textBox_usern.Clear();
textBox_pwd.Clear();

【讨论】:

  • int result = (int)cmd.ExecuteReader(); 不需要
  • 哎呀忘了删除它
  • 欢迎,@JayitaRoy 如果对您有帮助,请接受答案,感谢 TestWell 指出这一点
  • 这是一个比接受的答案更简洁的答案。你接受正确答案了吗?
【解决方案3】:

您的程序只检查用户是否存在..它不会发回类别。所以你应该使用执行阅读器。如果找到用户,它将发回详细信息。检查下面的代码。

 SqlConnection con = new SqlConnection("Data Source=JAYI-PC\\SQLEXPRESS; 
    Initial Catalog=db-ub;Integrated Security=True");
    try
    {
        con.Open();
      string cat = null;
        SqlCommand cmd = new SqlCommand(@"SELECT Username,Password,Category
        FROM Logins WHERE Username=@uname and
        Password=@pass", con);

        cmd.Parameters.AddWithValue("@uname", textBox_usern.Text);
        cmd.Parameters.AddWithValue("@pass", textBox_pwd.Text);

        SqlDataReader rdr = cmd.ExecuteReader();  
        //int result = (int)cmd.ExecuteScalar();

       int result = 0;
       while(rdr.Read()
     {
       result++; //to confirm it entered while loop so data is there
       cat = rdr["Category"].ToString();

     }

        if (result > 0)
        {
            if (cat == "Admin")//this one will chek whether user is admin or
                                 user
            {
                MessageBox.Show("Welcome Admin");
                Admin f1 = new Admin();
                f1.Show();
            }

            else
            {
                MessageBox.Show("Welcome " + textBox_usern.Text);
                FormCheck f3 = new FormCheck();
                f3.Show();
            }
        }

        else
        {
            MessageBox.Show("Incorrect login");
        }
        textBox_usern.Clear();
        textBox_pwd.Clear();

【讨论】:

  • 这只“猫”是从哪里来的?
  • @jayitaroy 在 con.open() 之后我声明了一个字符串 string cat = null;
  • @jayitaRoy 将其重命名为其他名称..类别..或您想要的名称
  • @jayitaRoy 它只是一个可变名称,您可以使用任何有意义的名称
  • 此代码显示“意外错误:索引超出数组范围”
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 2019-11-02
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多