我在服务器中创建了一个数据库,我在MySql查询浏览器中添加了一行用于测试。使用PhpMyAdmin或MySql查询浏览器可以看到此行。
但是当我想在我的程序中访问此表时,它说我没有行(reader.HasRows = false
)
cs是PublicVariables
class
这是代码
public static int checkuser(string myuser, string mypass)
{
try
{
using (MySqlConnection conn = new MySqlConnection(PublicVariables.cs))
{
string MypassMd5 = MakeMD5(mypass);
conn.Open();
if (conn == null)
Environment.Exit(0);
using (MySqlCommand cmd =
new MySqlCommand("SELECT username, password " + "FROM Users WHERE username = 'myuser'" ,conn))
{
using (MySqlDataReader reader = cmd.ExecuteReader())
{
//DateTime mytime = DateTime.Now ;
if (reader.HasRows)
{
if (Convert.ToString(reader["password"]) != MypassMd5)
{
reader.Close();
conn.Close();
return -1;
}
else
{
PublicVariables.UserId = Convert.ToString(reader["username"]);
PublicVariables.UserDegre = Convert.ToInt16(reader["userdegre"]);
conn.Close();
reader.Close();
return 1;
}
}
else
{
reader.Close();
conn.Close();
return 2;
}
}
}
}
}
catch (MySqlException ex)
{
MessageBox.Show(ex.ToString());
}
return 0;
}
我的代码有什么问题?
答案 0 :(得分:3)
主要错误在您的命令字符串中,myuser
是一个变量,您无法传递其值,将变量名称放在引号内。
new MySqlCommand("SELECT username, password FROM Users WHERE username = 'myuser'" ,conn)
而应该转换此行以使用参数化查询
string commandText = "SELECT username, password, userdegre FROM Users WHERE username = @uname";
using (MySqlCommand cmd = new MySqlCommand(commandText ,conn)
{
cmd.Parameters.AddWithValue("@uname", myuser);
....
查看代码后,您会遇到另一个错误。您尝试读取字段userdegre
,但查询未检索到此字段,因此您需要将其添加到检索字段列表中。
但是您真正需要知道的唯一字段是userdegre
,因为您已经知道用户名和密码,因此您可以删除datareader并使用ExecuteScalar并将用户名和密码作为WHERE子句的参数传递。如果您得到任何回报,那么您确信您的用户已通过数据库进行身份验证。
string commandText = "SELECT userdegre FROM Users WHERE username = @uname AND Password =@pwd";
using(MySqlCommand cmd = new MySqlCommand( commandText ,conn))
{
cmd.Parameters.AddWithValue("@uname", myuser);
cmd.Parameters.AddWithValue("@pwd", MypassMd5);
var result = cmd.ExecuteScalar();
if(result != null)
{
PublicVariables.UserId = myuser;
PublicVariables.UserDegre = result.ToString();
}
}
答案 1 :(得分:2)
不要检查reader.HasRows
。您需要致电reader.Read()
,并检查结果。
此外,还有一些问题:
conn.Close()
。这就是你的using
块的用途。他们将为您处理此事。userdegre
。把所有这些放在一起,你最终会得到这个:
public static int checkuser(string myuser, string mypass)
{
string passHash = BCrypt(mypass); //Need to get bcyrpt library and make the function
using (MySqlConnection conn = new MySqlConnection(PublicVariables.cs))
using (MySqlCommand cmd =
new MySqlCommand("SELECT username, password, userdegre FROM Users WHERE username = @user" ,conn))
{
cmd.Parameters.Add("@user", SqlDbType.NVarChar, 20).Value = myuser;
conn.Open();
using (MySqlDataReader reader = cmd.ExecuteReader())
{
if (!reader.Read()) return 2;
if (Convert.ToString(reader["password"]) != MypassMd5) return -1;
PublicVariables.UserId = Convert.ToString(reader["username"]);
PublicVariables.UserDegre = Convert.ToInt16(reader["userdegre"]);
return 1;
}
}
}
答案 2 :(得分:0)
我会尝试这样的事情new MySqlCommand("SELECT username, password, userdegre " + "FROM Users WHERE username = 'myuser'" ,conn))
在select语句中添加userdegre列名。
答案 3 :(得分:0)
最后对于c#2008 net 3.5在@Joel和@ Steve的帮助下的工作副本是这样的:
public static int usertrue(string myuser,string mypass)
{
try
{
using (MySqlConnection conn = new MySqlConnection(PublicVariables.cs))
{
string MypassMd5 = MakeMD5(mypass);
using (MySqlCommand cmd =
new MySqlCommand("SELECT username, password ,userdegre FROM Users WHERE username = @user",conn))
{
cmd.Parameters.Add("@user", MySqlDbType.VarChar, 15).Value = myuser;
conn.Open();
using (MySqlDataReader reader = cmd.ExecuteReader())
{
if (!reader.Read()) return 2;
if (Convert.ToString(reader["password"]) != MypassMd5) return -1; {
PublicVariables.UserId = Convert.ToString(reader["username"]);
PublicVariables.UserDegre = Convert.ToInt16(reader["userdegre"]);
return 1;
}
}
}
}
}