2013-01-07 34 views
17

试图看看是否有利于之前添加while (dr.read())功能。我的意思是,从技术上讲,如果它没有行,它不会读取,所以如果你先检查它,那么它会影响吗?应该如果调用SqlDataReader.HasRows,如果我打电话SqlReader.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 
    } 
}  
+2

如果if有else子句,这将是有益的。如果没有行,你想要特殊处理吗? –

回答

13

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

Read()将返回如果没有更多的行来获取,但Reader.HasRows更加有说服力,以它比Read()什么,所以这将是一个好的做法使用Reader.HasRows,因为您可能会意外除Read()之外的东西可能会陷入异常。

+10

请注意HasRows,因为当Read()**将返回SqlException时,它可能返回false。因为您的SQL中存在错误或者存在对Insert等数据约束的违反。通常,您需要知道是否确实只有没有行或者存在错误。 –

+2

@IvanAkcheurov是正确的。除了他的例子之外,被选为死锁受害者不会仅仅使用HasRows就知道 - 在调用Read()之前不会抛出SqlException。 – alexg

+0

这两个注释最终改变了什么应该是“良好实践”,即不要使用'HasRows()'将Read()短路。出于这个原因,我正在投票答案。 –

1

我认为这是主要用于存储程序,可能或者可能没有数据(一个或多个结果集),并且如果您还执行除while循环之外的其他内容(例如,在存在数据时初始化页眉/页脚等),则更容易检查。

2

检查DataReader是否有行(dr.HasRows)不是必需的。如果有更多数据要读取,Read()方法将返回true,如果没有更多数据,则返回false,从而打破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; 
       } 
      } 

您的意见需要

+0

在首次使用的站点声明变量,并使用'using'语句。 Downvoted。 –

5

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

相关问题