C# 如果我调用SqlReader.Read,是否应该调用SqlDataReader.HasRows

C# 如果我调用SqlReader.Read,是否应该调用SqlDataReader.HasRows,c#,sql,.net,methods,sqldatareader,C#,Sql,.net,Methods,Sqldatareader,尝试查看在while(dr.read())函数之前添加if(dr.HasRows)是否有益。我的意思是,从技术上讲,如果它没有行,它就不会被读取,那么,如果你先检查一下,这有什么关系吗 using (SqlDataReader dr = cmd.ExecuteReader()) { if (dr.HasRows) { while (dr.Read()) { ....do stuff here } }

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

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

我认为这主要适用于可能有数据也可能没有数据(一个或多个结果集)的存储过程,如果您还执行while循环以外的其他操作(即有数据时初始化页眉/页脚等),那么首先检查“更容易”(dr.HasRows),这不是必须的。如果有更多的数据要读取,Read()方法将返回true;如果没有更多的数据,则返回false,从而中断while循环。

no

Read()
将返回False如果没有更多的行可获取,但是
Reader.HasRows
Read()
更能说明它的功能,因此使用
Reader.HasRows
是一种好的做法,因为您可能会意外地执行
Read()以外的操作
可能会出现异常。

试试看

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

你的意见需要小心。HasRows()对于我的CTE查询返回false,即使有行(实际上是437行)。

如果if上有else子句,这将是有益的。如果没有行,是否需要特殊处理?请小心HasRows,因为当Read()返回SqlException时,它可能会返回false,例如,因为您的SQL中存在错误或在Insert上违反了数据约束等。通常,您需要知道是否真的没有行或存在错误。@IvanAkcheurov是正确的。除了他的例子之外,仅仅使用HasRows不会知道被选为死锁受害者-直到调用Read()时才会抛出SqlException。这两条注释最终会改变应该是“良好实践”的内容,即不要将
Read()
HasRows()
短路。出于这个原因,我投票否决了答案。@JohanBoulé哪种做法对你来说是好的?示例代码?@PreguntonCojoneroCabrón Ivan Akheurov的评论就是答案:不要为HasRows操心。问题的原始海报提供了一个直接调用Read()的示例代码,我认为这是更好的做法。我还再次意识到ADO.NET API的设计有些不好。在第一次使用的站点声明变量,并请使用
语句。被否决。