MySQLDataReader 不读取 C#
MySQLDataReader not reading C#
存储过程:
BEGIN
SELECT * FROM `user` WHERE `EmailAddress`= @p0 AND `Password` = @p1;
END
其中@p0 和@p1 是 Varchar(100)。
和代码:
using (MySqlConnection con = new MySqlConnection(Database.MySQLConstring))
{
using (MySqlCommand cmd = new MySqlCommand("LoginCheck", con))
{
cmd.CommandType = CommandType.StoredProcedure; //"LoginCheck"
cmd.Parameters.AddWithValue("email", Email);
cmd.Parameters.AddWithValue("password", Pword);
con.Open();
MySqlDataReader reader = cmd.ExecuteReader();
UserModel UM = new UserModel();
While (reader.Read())
{
UM.UserId = (int)reader["UserID"];
UM.DisplayName = (string)reader["DisplayName"];
UM.Moderator = (int)reader["Moderator"];
}
con.Close();
While(!string.IsNullOrEmpty(UM.DisplayName) && UM.UserId != 0)
{
Result = 1;
return UM;
}
Result = -1;
return UM;
}
}
代码 运行 成功执行到 while(reader.Read())
部分,然后它跳过它并转到 con.close()
。不会抛出任何错误或异常。当我使用它时一切都是 SQL 而不是 MySQL 时它起作用了,但我需要让它在 MySQL 中起作用。
当我 运行 存储过程本身在数据库中时,我得到了我需要的结果。但是当我使用代码时,它会跳过代码的 While 部分。
如果我要执行声明为的过程:
CREATE PROCEDURE x(em VARCHAR, pw VARCHAR) --declaration of parameters
BEGIN
SELECT * FROM `user` WHERE `EmailAddress`= em AND `Password` = pw;
END
我会确保我的 C# 代码中的参数命名与存储过程声明中的相同:
cmd.Parameters.Add(new MySqlParameter("em", Email));
cmd.Parameters.Add(new MySqlParameter("pw", Password));
我怀疑您的查询没有获取任何行,因为您设置的值永远不会进入参数,因此永远不会用于查询。 reader.Read() returns false,因为没有行。还要确保您查询的 EMail 和 Password 的值确实存在于 table
尝试调试,使您的查询像:
SELECT UserID, DisplayName, Moderator FROM `user` WHERE `EmailAddress`= @p0 AND `Password` = @p1
UNION ALL
SELECT 0, CONCAT_WS(' ', 'There is no user with email/password of', @p0, '/', @p1), '' FROM DUAL;
或者您的参数现在已命名..
你的 reader.Read() 现在应该 return 为真,因为这个查询应该总是 return 一行,所以检查 DisplayName 的值,它应该告诉你应用了哪些搜索词
存储过程:
BEGIN
SELECT * FROM `user` WHERE `EmailAddress`= @p0 AND `Password` = @p1;
END
其中@p0 和@p1 是 Varchar(100)。
和代码:
using (MySqlConnection con = new MySqlConnection(Database.MySQLConstring))
{
using (MySqlCommand cmd = new MySqlCommand("LoginCheck", con))
{
cmd.CommandType = CommandType.StoredProcedure; //"LoginCheck"
cmd.Parameters.AddWithValue("email", Email);
cmd.Parameters.AddWithValue("password", Pword);
con.Open();
MySqlDataReader reader = cmd.ExecuteReader();
UserModel UM = new UserModel();
While (reader.Read())
{
UM.UserId = (int)reader["UserID"];
UM.DisplayName = (string)reader["DisplayName"];
UM.Moderator = (int)reader["Moderator"];
}
con.Close();
While(!string.IsNullOrEmpty(UM.DisplayName) && UM.UserId != 0)
{
Result = 1;
return UM;
}
Result = -1;
return UM;
}
}
代码 运行 成功执行到 while(reader.Read())
部分,然后它跳过它并转到 con.close()
。不会抛出任何错误或异常。当我使用它时一切都是 SQL 而不是 MySQL 时它起作用了,但我需要让它在 MySQL 中起作用。
当我 运行 存储过程本身在数据库中时,我得到了我需要的结果。但是当我使用代码时,它会跳过代码的 While 部分。
如果我要执行声明为的过程:
CREATE PROCEDURE x(em VARCHAR, pw VARCHAR) --declaration of parameters
BEGIN
SELECT * FROM `user` WHERE `EmailAddress`= em AND `Password` = pw;
END
我会确保我的 C# 代码中的参数命名与存储过程声明中的相同:
cmd.Parameters.Add(new MySqlParameter("em", Email));
cmd.Parameters.Add(new MySqlParameter("pw", Password));
我怀疑您的查询没有获取任何行,因为您设置的值永远不会进入参数,因此永远不会用于查询。 reader.Read() returns false,因为没有行。还要确保您查询的 EMail 和 Password 的值确实存在于 table
尝试调试,使您的查询像:
SELECT UserID, DisplayName, Moderator FROM `user` WHERE `EmailAddress`= @p0 AND `Password` = @p1
UNION ALL
SELECT 0, CONCAT_WS(' ', 'There is no user with email/password of', @p0, '/', @p1), '' FROM DUAL;
或者您的参数现在已命名..
你的 reader.Read() 现在应该 return 为真,因为这个查询应该总是 return 一行,所以检查 DisplayName 的值,它应该告诉你应用了哪些搜索词