MySQLDataReader не читает C # - PullRequest
       25

MySQLDataReader не читает C #

0 голосов
/ 27 декабря 2018

Хранимая процедура:

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 Ответ

0 голосов
/ 27 декабря 2018

Если бы я собирался выполнить процедуру, которая была объявлена ​​как:

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 и пароля, которые вы запрашиваете, действительно существуют в таблице

Попробуйте для отладки сделать запрос следующим образом:

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, он должен сказать, какие условия поиска были применены

...