Имеет ли ExecuteScalar()
преимущества перед ExecuteReader()
?
Имеет ли ExecuteScalar() какие-либо преимущества перед ExecuteReader()?
Ответ 1
ExecuteScalar
возвращает только первое значение из первой строки набора данных. Внутренний он обрабатывается точно так же, как ExecuteReader()
, a DataReader
открывается, значение выбирается, а затем DataReader
уничтожается. Я также всегда интересовался этим поведением, но у него есть одно преимущество: оно происходит в рамках Framework... и вы не можете конкурировать с Framework в манерах скорости.
Изменить по rwwilden:
Взглянув с рефлектором внутри SqlCommand.ExecuteScalar()
, вы можете увидеть эти строки:
SqlDataReader ds = this.RunExecuteReader(
CommandBehavior.Default, RunBehavior.ReturnImmediately, true, "ExecuteScalar");
obj2 = this.CompleteExecuteScalar(ds, false);
То, что происходит внутри ExecuteReader
. Другим преимуществом является то, что ExecuteScalar
возвращает null
, когда данные не считываются. Если вы используете ExecuteReader
, вам придется проверить это самостоятельно.
Ответ 2
От Метод SqlCommand.ExecuteScalar
Используйте метод ExecuteScalar для получить одно значение (например, совокупное значение) из базы данных. Для этого требуется меньше кода, чем при использовании метода ExecuteReader, а затем выполняя операции, которые вы необходимо создать одно значение используя данные, возвращаемые SqlDataReader.
Также из В чем разница между ExecuteReader, ExecuteNonQuery и ExecuteScalar
- ExecuteReader: использование для доступа данные. Он обеспечивает только форвардную, только для чтения, связанный набор записей.
- ExecuteNonQuery: использование для данных манипуляции, такие как Insert, Update, Удалить.
- ExecuteScalar: использование для извлечения 1 строка 1 col. значение., то есть одиночное значение. например: для восстановления агрегатной функции. Это быстрее, чем другие способы извлечение единственного значения из БД.
Ответ 3
Из ExecuteScalar страница в MSDN:
Use the ExecuteScalar method to retrieve a single value (for example, an aggregate value) from a database. This requires less code than using the ExecuteReader method, and then performing the operations that you need to generate the single value using the data returned by a SqlDataReader
Итак, это не быстрее или лучше, а используется для уменьшения количества кода, написанного, когда требуется только одно значение.
Ответ 4
Когда у вас есть одно значение, возвращаемое из вашего запроса или SP, всегда лучше использовать ExecuteScalar(), поскольку он извлекает первое значение результата. Следовательно, в такой ситуации это происходит быстрее.
Ответ 5
Выполнить скаляр, предназначенный для получения одного значения из базы данных, а Execute Reader - для получения нескольких записей в DataTable.
Ответ 6
ExecuteScalar() будет потреблять меньше ресурсов по сравнению с ExecuteReader(), поскольку позже будет возвращать данные из нескольких столбцов из базы данных.
ExecuteReader() будет создавать экземпляр SqlDataReader, который основан на потоке и запрашивает результаты из источника данных