C# MySqlCommand.ExecuteNonQuery() return -1

Я пытаюсь выполнить запрос SQL в C#, чтобы узнать, зарегистрирован ли пользователь в моей базе данных. Для этого я использую следующий исходный код:

    public bool pseudoDispo(string pseudo)
    {
        // Ouverture de la connexion SQL
        this.OpenConnection();

        // Création d'une commande SQL en fonction de l'objet connection
        MySqlCommand cmd = this.connection.CreateCommand();
        cmd.CommandText = "SELECT COUNT(*) FROM `user` WHERE `pseudo` = '" + pseudo + "'";

        int test = cmd.ExecuteNonQuery();
        MessageBox.Show(test.ToString());

        // Exécution de la commande SQL
        if (cmd.ExecuteNonQuery() == 1)
        {
            this.connection.Close();
            MessageBox.Show("Registered");
            return true;
        }
        else
        {
            this.connection.Close();
            MessageBox.Show("Not Registered");
            return false;
        }
    }

Но проблема в том, что MySqlCommand.ExecuteNonQuery() всегда возвращает -1, и я не знаю почему. Мой запрос работает, потому что он возвращает мне хороший результат (1, если зарегистрирован, 0, если нет) на phpmyadmin.

Кто-нибудь может мне помочь и объяснить, что я делаю не так, пожалуйста?

Спасибо!

Редактировать: я пытался сделать свою функцию по-другому, используя ExecuteScalar(), но теперь у меня возникли некоторые проблемы с ним, потому что он всегда возвращает мне 0. Я явно не понимаю что-то, но я даже не знаю, что.. Могу ли я получить больше информации о ExecuteScalar() и такого рода функциях? Я попытался преобразовать его в строку, и кажется, что cmd запрашивает Int64. Поэтому я обновил свой код таким образом, но он все еще не работает. Я довольно подавлен из-за недостатка знаний, но в любом случае вот код:

    public int pseudoDispo(string pseudo)
    {
        Int64 dispo_pseudo = 0;
        string sql = "SELECT COUNT(*) FROM `user` WHERE `pseudo` = '[pseudo] = ?' ";

        MySqlCommand cmd = new MySqlCommand(sql);
        try
        {
            this.OpenConnection();

            OleDbCommand dbcommand = new OleDbCommand(sql);

            dbcommand.Parameters.AddWithValue("@p1", pseudo);
            dbcommand.CommandType = CommandType.Text; 

            dispo_pseudo = (Int64)dbcommand.ExecuteScalar();

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        return (int)dispo_pseudo;
    }

2 ответа

Решение

Ты звонишь ExecuteNonQuery, несмотря на попытки выполнить... запрос. Вы должны использовать ExecuteScalar - или же ExecuteQuery и проверьте, есть ли какие-либо результаты.

ExecuteNonQuery специально для операторов SQL вставки / удаления / обновления, а возвращаемое число - количество затронутых строк.

Из документации IDbCommand.ExecuteNonQuery:

Для операторов UPDATE, INSERT и DELETE возвращаемое значение - это количество строк, затронутых командой. Для всех других типов операторов возвращаемое значение равно -1.

(Кроме того, вы почти наверняка должны каждый раз создавать новое соединение и использовать using операторы для всех одноразовых предметов, которые вы используете, таких как MySqlCommand.)

Как уже упоминалось, вы пытаетесь получить результаты из запроса. ExecuteNonQuery будет работать только для операторов SQL, которые не возвращают результаты.

Попробуйте что-то вроде этого:

    string strResult;
    SqlDataReader sqlResult = cmd.ExecuteReader();
            while (sqlResult.Read())
            {
               strResult  = result[0].ToString();
            }
Другие вопросы по тегам