ExecuteScalar
возвращает только первое значение из первой строки набора данных. Внутренний он обрабатывается так же, как ExecuteReader()
, открывается DataReader
, выбирается значение и впоследствии DataReader
уничтожается. Я также всегда задавался вопросом об этом поведении, но у него есть одно преимущество: оно происходит в рамках Framework ... и вы не можете конкурировать с Framework по-своему.
Редактировать rwwilden:
Взглянув на Reflector внутри SqlCommand.ExecuteScalar()
, вы увидите следующие строки:
SqlDataReader ds = this.RunExecuteReader(
CommandBehavior.Default, RunBehavior.ReturnImmediately, true, "ExecuteScalar");
obj2 = this.CompleteExecuteScalar(ds, false);
Именно то, что происходит внутри ExecuteReader
. Другое преимущество состоит в том, что ExecuteScalar
возвращает null
, когда данные не читаются. Если вы используете ExecuteReader
, вам придется проверить это самостоятельно.