【发布时间】: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),您将看到列标题为
UsernamePassword而不是teacher.username等 -
所以我需要进行查询以获取列名中的值?
-
我猜在这种情况下 MSSQL 和 MySQL 有类似的行为。尝试指定要选择的列而不是
*。 -
同样的事情。手动运行查询进行检查。列将返回
UsernamePassword。您正在指示程序查找名为teacher.username等的列,这会引发错误。 -
好吧,我试试看