如果我调用SqlReader.Read,应该调用SqlDataReader.HasRows

时间:2013-01-07 13:08:04

标签: c# sql .net methods sqldatareader

尝试查看在if (dr.HasRows)函数之前添加while (dr.read())是否有益。我的意思是,从技术上讲,如果它没有行,它就不会读取,所以如果你先检查一下会有什么关系吗?

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

或者,如果你只是确保它有值来提供......那么这基本上会做同样的事情......

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

5 个答案:

答案 0 :(得分:15)

否..如果DataReader包含任何行,则不必检查(dr.HasRows)

如果没有其他要提取的行,

Read()将返回 False ,但Reader.HasRowsRead()更能说明它的作用,所以它使用Reader.HasRows将是 良好做法 ,因为您可能会意外地执行Read()以外可能属于例外的事情。

答案 1 :(得分:5)

小心点。 HasRows()为我的CTE查询返回false,即使有行(实际上是437行)。

答案 2 :(得分:2)

检查DataReader是否有行(dr.HasRows)并不是必需的。如果有更多数据要读取,Read()方法将返回true,如果没有更多数据,则返回false,从而打破while循环。

答案 3 :(得分:1)

我认为这主要是针对存储过程,这些存储过程可能有也可能没有数据(一个或多个结果集),如果您还执行除while循环之外的其他操作,则首先检查它是“更容易”(即初始化标头/有数据的页脚等。

答案 4 :(得分:-4)

            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;
                }
            }

您需要的意见