【问题标题】:conditional statement in sql error in C# [offTopic]C# 中 sql 错误中的条件语句 [offTopic]
【发布时间】:2017-02-27 06:38:34
【问题描述】:

我正在尝试使用参数化的 sql 和跨表查询来创建登录系统。

这是我在 C# 中登录的代码:

private void userloigin() {

    using (MySqlConnection connection = new MySqlConnection("datasource=**;port=***;database=***;username=***;password=***;")) {

        MySqlCommand cmd = new MySqlCommand("SELECT * FROM student, teacher WHERE (student.Username = @userName AND student.Password = @passWord) OR (teacher.username = @teacherUser AND teacher.password = @teacherPass);");
        cmd.CommandType = CommandType.Text;
        cmd.Connection = connection;
        cmd.Parameters.AddWithValue("@userName", textboxUsername.Text);
        cmd.Parameters.AddWithValue("@passWord", texBoxPassword.Text);
        cmd.Parameters.AddWithValue("@teacherUser", textboxUsername.Text);
        cmd.Parameters.AddWithValue("@teacherPass", texBoxPassword.Text);
        connection.Open();
        MySqlDataReader DBReader;
        cmd.Connection = connection;
        DBReader = cmd.ExecuteReader();
        int check = 0;
        while (DBReader.Read()) {
            var teacherLogin = DBReader.GetString("username");
            var teacherPass = DBReader.GetString("password");
            var studentLogin = DBReader.GetString("Username");
            var studentPass = DBReader.GetString("Password");

            if (teacherLogin == textboxUsername.Text && teacherPass == texBoxPassword.Text) {
                MessageBox.Show("Login Successfull!");
                this.Hide();
                Registration ss = new Registration();
                ss.Show();
            } else if (studentLogin == texBoxPassword.Text && studentPass == texBoxPassword.Text) {
                MessageBox.Show(" Login Successfull");

                this.Hide();
                Test ss = new Test();
                ss.Show();
            } else {
                MessageBox.Show("Username or Password Incorrect.  Try Again please");
            }
        }   
    }
}

因为用户名和密码在“老师”和“学生”两个表中。登录将允许学生登录,但不允许老师登录。这是可以理解的。但是,当我这样做时:

tbl_name.col_name

我收到一条错误消息:

MySql.Data 中出现“System.IndexOutOfRangeException”类型的未处理异常

附加信息:在结果中找不到指定的列:teacher.username

 var teacherLogin = DBReader.GetString("teacher.username");
 var teacherPass = DBReader.GetString("teacher.password");
 var studentLogin = DBReader.GetString("student.Username");
 var studentPass = DBReader.GetString("student.Password");

问题:

如何修改我的代码,以便在“老师”登录时将老师带到注册表。

同样,如果学生登录,然后将学生带到测试表?

我做错了什么?

     using (MySqlConnection connection = new MySqlConnection("datasource=localhost;port=3306;database=project;username=root;password=Greenford123;"))
        {
            MySqlCommand cmd = new MySqlCommand("SELECT student.studentUsername, student.studentPassword, teacher.teacherUsername, teacher.teacherPassword FROM student, teacher WHERE (student.studentUsername = @userName AND student.studentPassword = @passWord) OR (teacher.teacherUsername = @teacherUser AND teacher.teacherPassword = @teacherPass);");
            cmd.CommandType = CommandType.Text;
            cmd.Connection = connection;
            cmd.Parameters.AddWithValue("@userName", textboxUsername.Text);
            cmd.Parameters.AddWithValue("@passWord", texBoxPassword.Text);
            cmd.Parameters.AddWithValue("@teacherUser", textboxUsername.Text);
            cmd.Parameters.AddWithValue("@teacherPass", texBoxPassword.Text);
            connection.Open();
            MySqlDataReader DBReader;
            cmd.Connection = connection;
            DBReader = cmd.ExecuteReader();

            while (DBReader.Read())
            {
                var teacherLogin = DBReader.GetString("teacherUsername");
                var teacherPass = DBReader.GetString("teacherPassword");
                var studentLogin = DBReader.GetString("studentUsername");
                var studentPass = DBReader.GetString("studentPassword");

                if (teacherLogin == textboxUsername.Text && teacherPass == texBoxPassword.Text)
                {
                    MessageBox.Show("Login Successfull!");

                    this.Hide();
                    Registration ss = new Registration();
                    ss.Show();
                }
                else if (studentLogin == texBoxPassword.Text && studentPass == texBoxPassword.Text)
                {
                    MessageBox.Show(" Login Successfull");

                    this.Hide();
                    Test ss = new Test();
                    ss.Show();
                }
                else
                {
                    MessageBox.Show("Username or Password Incorrect.  Try Again please");
                }

            }

编辑: 它现在可以工作,但它只允许教师访问系统。如果学生尝试登录,它会说

用户名或密码错误。请再试一次

【问题讨论】:

  • 您收到该错误是因为查询将列名作为实际列名返回。示例 如果您在 MSSQLSM Studio 中运行查询(假设您有 MSSQL),您将看到列标题为 Username Password 而不是 teacher.username
  • 所以我需要进行查询以获取列名中的值?
  • 我猜在这种情况下 MSSQL 和 MySQL 有类似的行为。尝试指定要选择的列而不是 *
  • 同样的事情。手动运行查询进行检查。列将返回 Username Password。您正在指示程序查找名为 teacher.username 等的列,这会引发错误。
  • 好吧,我试试看

标签: c# mysql login


【解决方案1】:

错误是因为这个

else if (studentLogin == texBoxPassword.Text && studentPass == texBoxPassword.Text)

在哪里studentLogin == texBoxPassword.Text 因此

用户名或密码错误。

改用

else if (studentLogin == textboxUsername.Text && studentPass == texBoxPassword.Text)

【讨论】:

  • 没问题的朋友。我希望你会注意到它,并等着看其他人是否会在 cmets 中指出它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 2022-10-14
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
相关资源
最近更新 更多