MySQLDataReader не читает 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.
Когда я запускаю саму хранимую процедуру в базе данных, я получаю нужный результат. но когда я использую код, он пропускает часть кода.
1 ответ
Если бы я собирался выполнить процедуру, которая была объявлена как:
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() возвращает false, потому что строк нет. Также убедитесь, что значения EMail и Password, которые вы запрашиваете, действительно существуют в таблице.
Попробуйте отладку, чтобы ваш запрос был похож на:
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 () должен теперь возвращать true, потому что этот запрос должен всегда возвращать строку, поэтому проверьте значение DisplayName, он должен сказать, какие условия поиска были применены