#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 может захотеть использовать результирующий набор для других целей.