ExecuteScalar()
only returns the value from the first column of the first row of your query.
ExecuteReader()
returns an object that can iterate over the entire result set while only keeping one record in memory at a time.
ExecuteNonQuery()
does not return data at all: only the number of rows affected by an insert, update, or delete.
Additionally, you can look at the DbDataAdapter
type, which includes a Fill()
method that allows you to download the entire resultset into a DataTable
or DataSet
object, as well as a number of other abilities.
Finally, this seems like a good time for you to get familiar with Microsoft Docs. This is what documentation is made for: you have the method names; go look them up.