c # ExecuteNonQuery всегда возвращает ноль

#c# #sql #executenonquery

#c# #sql #executenonquery

Вопрос:

Я думаю, что с подключением все в порядке, потому что, когда я его открываю, оно не выдает никаких ошибок. Поэтому я предполагаю, что ошибка возникает при выполнении команды. Это мой код:

 OleDbCommand cmd = new OleDbCommand("SELECT * FROM cars", conn);
cmd.CommandType = CommandType.Text;
int numbers = cmd.ExecuteNonQuery();
  

Я пытался использовать окно сообщения для отображения значения numbers , но результат всегда равен 0. Таблица cars содержит 5 записей. Так почему я не получаю правильные результаты ?..

Ответ №1:

Анонимному даунвотеру ключевая часть операции:

Я пытался использовать окно сообщения для отображения значения чисел, но результат всегда равен 0. Таблица cars содержит 5 записей. Так почему я не получаю правильные результаты ?..

Очевидно, что OP пытается получить количество записей в таблице (скалярный агрегат), а не все данные таблицы.

Мой ответ:

Это потому, что ваш запрос возвращает таблицу, а не скалярное значение, и вы вызываете неправильную функцию. Ваш запрос должен быть должен быть:

 "SELECT COUNT(*) FROM cars"
  

И ExecuteNonQuery фактически не ожидает возврата каких-либо результатов. (Обычно вы выполняете операции вставки, обновления и удаления с помощью ExecuteNonQuery .) Вы должны использовать ExecuteScalar, который ожидает однозначный результат, такой как count(*) .

Теперь все вместе:

 OleDbCommand cmd = new OleDbCommand("SELECT count(*) FROM cars", conn);
cmd.CommandType = CommandType.Text;
int numbers = cmd.ExecuteScalar();
  

Комментарии:

1. Для запроса select *, подобного тому, который он показал, ExecuteScalar не помогает.

2. Круто! Приятно! Пока не могу принять, но он говорит мне: «Вы можете принять ответ через 6 минут». в любом случае, спасибо! Но как я могу получить разные поля, например, id, имена и тому подобное ?..

3. @DavidePiras: Если вы внимательно прочитаете вопрос, вы увидите, что запрос неверен. Операционная система пытается получить совокупный … количество записей в таблице.

4. Нет, потому что вопрос неясен, и он упоминает числа, но не четко агрегирует… Я все равно не проголосовал против вас.

5. @DavidePiras: Нет, вопрос не является явным, но смысл ясен. OP ожидает, что будет возвращено одно число. Количество элементов в таблице. Термины не используются, но это скалярное, агрегированное значение. count(*) — это агрегированная функция.

Ответ №2:

Попробуйте использовать ExecuteScalar, который должен дать вам количество. ExecuteNonQuery не возвращает результаты вашего запроса. Возврат, на который вы смотрите, указывает, на сколько строк повлиял ваш оператор, в вашем случае ноль.

Ответ №3:

ExecuteNonQuery, как следует из названия, не выполняет запрос. обычно он используется для вставок или обновлений и возвращает количество затронутых записей. для предоставленного вами запроса вы должны использовать ExecuteReader или DataAdapter и его метод заполнения для заполнения таблицы данных.

Ответ №4:

Поскольку вы выполняете запрос, а ExecuteNonQuery возвращает количество выполненных строк, которое при выборе всегда равно 0, поскольку вы ничего не меняете (т.е. ВСТАВИТЬ, ОБНОВИТЬ или УДАЛИТЬ)

Ответ №5:

ExecuteNonQuery возвращает только количество строк, затронутых операциями ОБНОВЛЕНИЯ, УДАЛЕНИЯ или вставки. Для количества строк в инструкции SELECT попробуйте:

 OleDbCommand cmd = new OleDbCommand("SELECT * FROM cars", conn);
OleDbDataReader reader = cmd.ExecuteReader();

int numbers = 0;
while (reader.Read())
{
    //// other Reader-related operations here...

    numbers  ;
}
  

Комментарии:

1. Но это действительно плохо, если ему нужен счетчик, который должен учитываться в SQL, а не в цикле всех записей на стороне клиента!

2. Согласен, КОЛИЧЕСТВО намного лучше, хотя я предполагаю, что OP может захотеть использовать результирующий набор для других целей.