ExecuteScalar
only returns the first value from the first row of the dataset. Internal it is treated just like ExecuteReader()
, a DataReader
is opened, the value is picked and the DataReader
gets destroyed afterwards. I also always wondered about that behavior, but it has one advantage: It takes place within the Framework...and you can't compete with the Framework in manners of speed.
Edit By rwwilden:
Taking a look with Reflector inside SqlCommand.ExecuteScalar()
you can see these lines:
SqlDataReader ds = this.RunExecuteReader(
CommandBehavior.Default, RunBehavior.ReturnImmediately, true, "ExecuteScalar");
obj2 = this.CompleteExecuteScalar(ds, false);
Exactly what happens inside ExecuteReader
. Another advantage is that ExecuteScalar
returns null
when no data is read. If you use ExecuteReader
, you'd have to check this yourself.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…