Каково различие между ExecuteScalar, ExecuteReader и ExecuteNonQuery?

Каковы различные случаи, когда мы используем эти три? Где я должен использовать один и где должен я нет?

99
задан Mark Wilkins 30 November 2013 в 19:46
поделиться

4 ответа

  • ExecuteScalar обычно используется, когда ваш запрос возвращает одно значение. Если он возвращает больше, то результатом является первый столбец первой строки. Примером может быть SELECT @@ IDENTITY AS 'Identity' .
  • ExecuteReader используется для любого набора результатов с несколькими строками / столбцами (например, SELECT col1, col2 from sometable ).
  • ExecuteNonQuery обычно используется для операторов SQL без результатов (например, UPDATE, INSERT и т. Д.).
179
ответ дан 24 November 2019 в 04:58
поделиться

Из документации (примечание: MSDN - удобный ресурс, когда вы хотите знать, что делают вещи!):

ExecuteScalar

Используйте метод ExecuteScalar для получения одного значения (например, агрегированного значения) из базы данных. Это требует меньше кода, чем использование метода ExecuteReader, а затем выполнение операций, необходимых для создания единичного значения с использованием данных, возвращаемых SqlDataReader.

ExecuteReader

Отправляет текст CommandText в соединение и создает SqlDataReader.

... и из SqlDataReader ...

Предоставляет способ чтения только прямого потока строк из базы данных SQL Server. Этот класс не может быть унаследован.

ExecuteNonQuery

Вы можете использовать ExecuteNonQuery для выполнения операций каталога (например, запроса структуры базы данных или создания объектов базы данных, таких как таблицы), или для изменения данных в базе данных без использования DataSet путем выполнения операторов UPDATE, INSERT или DELETE.

9
ответ дан 24 November 2019 в 04:58
поделиться

Каждый из них представляет собой выполнение разного типа.

  • ExecuteScalar будет типом запроса, который будет возвращать одно значение.

    Примером может быть возврат сгенерированного id после вставки.

    INSERT INTO my_profile (Address) VALUES ('123 Fake St.'); SELECT CAST(scope_identity() AS int)

  • ExecuteReader дает вам читателя данных который позволит вам прочитать все столбцы результатов по строке за раз.

    Примером может служить получение информации о профиле одного или нескольких пользователей.

    SELECT * FROM my_profile WHERE id = '123456'

  • ExecuteNonQuery - это любой SQL, который не возвращает значения, но фактически выполняет некоторую работу например, вставка, удаление или изменение что-то.

    Примером может служить обновление профиля пользователя в базе данных.

    UPDATE my_profile SET Address = '123 Fake St.' WHERE id = '123456'

37
ответ дан 24 November 2019 в 04:58
поделиться

Чтобы добавить к тому, что опубликовали другие:

ExecuteScalar концептуально возвращает крайний левый столбец из первой строки набора результатов запроса; вы можете выполнить ExecuteScalar a SELECT * FROM staff, но вы получите только первую ячейку из результирующих строк Обычно используется для запросов, возвращающих одно значение. Я не уверен на 100% насчет SQLServer, но в Oracle вы не используете его для запуска FUNCTION (код базы данных, который возвращает одно значение) и ожидаете, что он даст вам возвращаемое значение функции даже хотя функции возвращают одиночные значения .. Однако, если вы выполняете функцию как часть запроса, например SELECT SUBSTR ('abc', 1, 1) FROM DUAL, тогда он даст возвращаемое значение в силу того факта, что возвращаемое значение хранится в самой верхней левой ячейке результирующего набора строк

ExecuteNonQuery будет использоваться для запуска базы данных хранимые процедуры, функции и запросы, которые изменяют данные (INSERT / UPDATE / DELETE) или изменяют структуру базы данных (CREATE TABLE ...). Обычно возвращаемое значение вызова является показателем того, сколько строк было затронуто операцией, но проверьте документацию БД, чтобы гарантировать это

8
ответ дан 24 November 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: