I have the following situation:
using (SqlConnection conexao = new SqlConnection(ConnectionString))
{
SqlCommand comando = new SqlCommand(query, conexao);
comando.Parameters.AddWithValue("id", idUsuario);
conexao.Open();
SqlDataReader reader = comando.ExecuteReader(CommandBehavior.SingleRow);
if (reader.Read())
{
Hydrate(out entity, reader);
}
}
So, if reader
contains valid results and HasRows == true
, then reader.Read()
should return true, right?
Well, it doesn't for me. I have no idea of what is going on, because the Hydrate(out entity, reader);
line is never getting hit.
Can someone please help me understand this?
Thank you!
1 Answer 1
Actually, what happens is SqlDataReader.Read returns true if it is NOT the last row.
Your behavior specifies "SingleRow", so the reader aligns the reader to the first row, and returns false saying "there are no rows left after this one".
See this link Here for the documentation on this: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.read.aspx
"true if there are more rows; otherwise false."
Of interest, however, their examples seem like they would ignore the very last row based on that sentence...
-
I know this is old, but in case anyone else reads this, I feel this could be misleading. Microsoft's documentation (in the Remarks) says
The default position of the SqlDataReader is before the first record. Therefore, you must call Read to begin accessing any data.
I take this to mean callingRead
returns true when there is a row to read (the row pointer is at a valid row). If you are on the last row and callRead
it will return false because there is nothing after, but if you are on the second last and callRead
, it will return True and move the row pointer to the last row.Shaggie– Shaggie2023年03月11日 00:46:41 +00:00Commented Mar 11, 2023 at 0:46