c # ExecuteNonQuery всегда возвращает ноль - PullRequest
3 голосов
/ 14 октября 2011

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

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

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

Ответы [ 5 ]

4 голосов
/ 14 октября 2011

Для анонимного downvoter ключевая часть ОП:

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

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

Мой ответ:

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

"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 голос
/ 14 октября 2011

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

1 голос
/ 14 октября 2011

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

0 голосов
/ 14 октября 2011

ExecuteNonQuery возвращает только количество строк, затронутых операциями UPDATE, DELETE или INSERT.Для количества строк в операторе 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++;
}
0 голосов
/ 14 октября 2011

Поскольку вы выполняете запрос, а ExecuteNonQuery возвращает количество выполненных строк, которое при выборе всегда равно 0, поскольку вы ничего не меняете (т. Е. INSERT, UPDATE или DELETE)

...