2013-01-07 36 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。

相關問題