В чем разница между ExecuteScalar, ExecuteReader и ExecuteNonQuery?

106

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

нектар
источник
1
Я нашел эту замечательную статью на том же сайте: webblogsforyou.com/…
immayankmodi

Ответы:

191
  • ExecuteScalarобычно используется, когда ваш запрос возвращает одно значение. Если он возвращает больше, то результатом является первый столбец первой строки. Пример может быть SELECT @@IDENTITY AS 'Identity'.
  • ExecuteReaderиспользуется для любого набора результатов с несколькими строками / столбцами (например, SELECT col1, col2 from sometable).
  • ExecuteNonQuery обычно используется для операторов SQL без результатов (например, UPDATE, INSERT и т. д.).
Марк Уилкинс
источник
40
ExecuteNonQueryможет возвращать количество затронутых строк.
Санграм Нандкхиле 08
Я думал, что ExecuteNonQuery используется, когда вам нужно вызвать хранимые процедуры, которые вернут коллекцию таблиц.
Gogutz
ExecuteNonQuery также работает, если у вас есть оператор возврата в хранимой процедуре. stackoverflow.com/questions/6210027/…
FrenkyB
40

ExecuteNonQuery ():

  1. будет работать только с запросами действий (создание, изменение, удаление, вставка, обновление, удаление).
  2. Возвращает количество строк, обработанных запросом.
  3. Тип возврата - int
  4. Возвращаемое значение не является обязательным и может быть присвоено целочисленной переменной.

ExecuteReader ():

  1. будет работать с запросами действия и бездействия (Выбрать)
  2. Возвращает коллекцию строк, выбранных запросом.
  3. Тип возврата - DataReader.
  4. Возвращаемое значение является обязательным и должно быть присвоено другому объекту DataReader.

ExecuteScalar ():

  1. будет работать с запросами без действий, которые содержат агрегатные функции.
  2. Вернуть значение первой строки и первого столбца результата запроса.
  3. Тип возврата - объект.
  4. Возвращаемое значение обязательно и должно быть присвоено переменной требуемого типа.

Ссылка URL:

http://nareshkamuni.blogspot.in/2012/05/what-is-difference-between.html

umarali1981
источник
38

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

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

    Примером будет возвращение сгенерированного идентификатора после вставки.

    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'

Брендан Энрик
источник
1
Кажется, что вы можете использовать ExecuteReader для выполнения заданий, выполняемых как ExecuteScalar, так и ExecuteNonQuery, так зачем использовать два других? какое-либо преимущество в производительности?
user20358
Одна из причин, по которой следует избегать чрезмерного использования ExecuteReader, заключается в том, что он будет держать этого читателя рядом, пока вы не закончите с ним. Со всем этим вы хотите знать некоторую конкретную информацию о том, как они работают, чтобы использовать их наиболее эффективно. Я изложил здесь несколько хороших рекомендаций.
Брендан Энрик
9

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

ExecuteScalar

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

ExecuteReader

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

... и из SqlDataReader ...

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

ExecuteNonQuery

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

Грег Бич
источник
8

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

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

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

Мэтт
источник
4

ExecuteReader() выполняет SQL-запрос, который возвращает объект поставщика данных DBDataReader, который обеспечивает доступ только для пересылки и только для чтения для результата запроса.

ExecuteScalar()аналогичен ExecuteReader()методу, разработанному для одноэлементного запроса, такого как получение количества записей.

ExecuteNonQuery() выполнить не запрос, который работает с созданием, удалением, обновлением, вставкой)

Роджерс
источник
3

ExecuteNonQuery

Этот метод ExecuteNonQuery будет использоваться только для операторов insert, update и delete, Create и SET. Метод ExecuteNonQuery вернет количество строк, выполненных с помощью операций INSERT, DELETE или UPDATE.

ExecuteScalar

Получать отдельные значения из базы данных очень быстро. Execute Scalar вернет значение одиночной строки одиночного столбца, т.е. одиночное значение, при выполнении SQL-запроса или хранимой процедуры с использованием объекта команды. ExecuteReader

Execute Reader будет использоваться для возврата набора строк при выполнении SQL-запроса или хранимой процедуры с использованием объекта команды. Этот метод предназначен для прямого извлечения записей и используется для чтения значений таблицы от первого до последнего.

Шайлендра Мишра
источник
3

Метод ExecuteNonQuery вернет количество строк, выполненных с помощью операций INSERT, DELETE или UPDATE. Этот метод ExecuteNonQuery будет использоваться только для операторов insert, update и delete, Create и SET. (Читать далее)

ExecuteScalar вернет одиночное значение столбца строки, то есть одиночное значение, при выполнении SQL-запроса или хранимой процедуры с использованием объекта команды. Получать отдельные значения из базы данных очень быстро. (Читать далее)

ExecuteReader будет использоваться для возврата набора строк при выполнении SQL-запроса или хранимой процедуры с использованием объекта команды. Этот метод предназначен для прямого извлечения записей и используется для чтения значений таблицы от первого до последнего. (Читать далее)

Зия Ур Рахман
источник
1

ExecuteNonQuery: обычно используется, когда операторы Sql ничего не возвращают, например операции вставки, обновления и удаления.

cmd.ExcecuteNonQuery();

ExecuteScalar:

Он будет использоваться, когда запрос Sql возвращает одно значение.

Int b = cmd.ExcecuteScalar();

ExecuteReader

Он будет использоваться, когда запрос Sql или хранимая процедура возвращает несколько строк / столбцов.

SqlDataReader dr = cmd.ExecuteReader();

для получения дополнительной информации щелкните здесь http://www.dotnetqueries.com/Article/148/-difference-between-executescalar-executereader-executenonquery

DotNetLover
источник