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

24

尝试确定在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
    }
}    

2
如果if语句中有else子句会很有益。如果没有行,您是否需要特殊处理? - Mark Peters
5个回答

20

不是强制要求检查 (dr.HasRows) 来确定 DataReader 是否包含任何行。

如果没有更多的行可以获取,Read() 将返回 False,但是相对于 Read()Reader.HasRows 更能说明它的作用,因此使用 Reader.HasRows 是一个良好的实践,因为您可能会意外地执行一些除 Read() 以外的操作,这可能会导致异常。


13
使用HasRows时要小心,因为当Read()将返回SqlException(例如由于SQL中存在错误或在插入等操作中存在数据约束冲突)时,它可能会返回false。通常情况下,你需要知道是否真的没有行或者是出现了错误。请注意不改变原意,使翻译更加通俗易懂。 - Ivan Akcheurov
2
@IvanAkcheurov 是正确的。除了他的例子之外,仅使用 HasRows 无法知道是否被选为死锁受害者 - 直到调用 Read() 才会抛出 SqlException。 - alexg
2
这两个注释最终改变了应该是“良好实践”的做法,即不要用HasRows()来短路Read()。因此,我会投反对票。 - Johan Boulé
@JohanBoulé,你认为哪种做法是最好的?有示例代码吗? - PreguntonCojoneroCabrón
@PreguntonCojoneroCabrón Ivan Akcheurov的评论就是答案:不要费心去使用HasRows。问题的原始发布者提供了一个直接调用Read()的示例代码,我认为这是更好的实践。我也意识到ADO.NET API在某些地方设计得相当糟糕。 - Johan Boulé

6

注意。我的CTE查询在使用HasRows()函数时返回false,尽管有行数据(实际上有437行)。


2

检查DataReader是否有行(dr.HasRows)并不是必须的。Read()方法会在还有更多数据可读取时返回true,如果没有更多数据,则返回false,从而中断while循环。


1

我认为这主要是针对存储过程的,这些存储过程可能有数据(一个或多个结果集),首先检查会比较“容易”,以防您在 while 循环中还做其他事情(例如,在存在数据时初始化页眉/页脚等)。


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

需要您的意见


在第一次使用的地方声明变量,并请使用“using”语句。被踩了。 - Aluan Haddad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接