25

Trying to see if it is beneficial to add an if (dr.HasRows) before the while (dr.read()) function. I mean, technically if it doesn't have rows it isn't going to read, so would it matter if you checked this first?

using (SqlDataReader dr = cmd.ExecuteReader())
{
    if (dr.HasRows)
    {
        while (dr.Read())
        {
            ....do stuff here
        }
    }
}

or is this going to essentially do the exact same thing if you're just making sure it has values to provide...

using (SqlDataReader dr = cmd.ExecuteReader())
{
    while (dr.Read())
    {
        ....do stuff here
    }
}    
1
  • 2
    It would be beneficial if there was an else clause on the if. Do you want special handling if there are no rows? Commented Jan 7, 2013 at 13:12

5 Answers 5

20

No..It is not mandatory to check (dr.HasRows) if the DataReader contains any row or not.

Read() will return False if there are no more rows to fetch, but Reader.HasRows is much more telling as to what it does than Read() so it would be a good practice to use Reader.HasRows because you may accidentally do something other than Read() which may fall into exception.

Sign up to request clarification or add additional context in comments.

5 Comments

Be careful with HasRows as it may return false when Read() would return SqlException e.g. because there is an error in your SQL or there is a violation of data constraints on Insert, etc. Usually you need to know if there are really just no rows or there is an error.
@IvanAkcheurov is correct. In addition to his examples, being selected as a deadlock victim will not be known by just using HasRows - SqlException is not thrown until Read() is invoked.
These two comments eventually change what ought to be the "good practise", i.e. don't short-circuit Read() with HasRows(). For this reason, i'm voting the answer down.
@JohanBoulé which is the good practice for you ? sample code ?
@PreguntonCojoneroCabrón Ivan Akcheurov's comment is the answer: don't bother with HasRows. The original poster of the question provided a sample code which calls Read() directly, and I conclude this is the better practice. I also realise once again that the ADO.NET API has quite some bad design here and there.
6

Be careful. HasRows() returns false for my CTE query, even though there are rows (437 rows actually).

Comments

2

It's not mandatory to check if the DataReader has rows (dr.HasRows). The Read() method will return true if there is more data to read and false if there's no more data, thus breaking the while-loop.

Comments

1

I think this is mostly for stored procedures which may or may not have data (one or more result sets) and it is "easier" to check first in case you also do other stuff than the while loop (i.e. initialize header/footer etc. when there is data).

Comments

-4

try

            string myconnection = "datasource= localhost;port=3306;username=root;password=root;";
            MySqlConnection myconn = new MySqlConnection(myconnection);

            //MySqlDataAdapter mydata = new MySqlDataAdapter();
            MySqlDataReader myreader;

            MySqlCommand SelectCommand = new MySqlCommand("select *from student_info.student_info where username= '" + textBox1.Text +" 'and password=' " + textBox2.Text +"';",myconn );


            myconn.Open();

            myreader = SelectCommand.ExecuteReader();
            int count = 0;
            if (myreader.HasRows) //returing false but i have 4 row
            {
                while (myreader.Read()) //returing false 
                {
                    MessageBox.Show("in button3");
                    count = count + 1;
                }
            }

your opinion required

1 Comment

Declare variables at the site of first use, and please use using statements. Downvoted.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.