2013-01-07 31 views
17

Cố gắng xem liệu có ích gì khi thêm một if (dr.HasRows) trước hàm while (dr.read()) hay không. Tôi có nghĩa là, về mặt kỹ thuật nếu nó không có hàng nó sẽ không đọc, vì vậy nó sẽ quan trọng nếu bạn kiểm tra này đầu tiên?Nên nếu gọi SqlDataReader.HasRows nếu tôi đang gọi SqlReader.Read

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

hoặc được này sẽ chủ yếu làm chính xác những điều tương tự nếu bạn chỉ cần đảm bảo nó có giá trị để cung cấp ...

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

Sẽ có ích nếu có một mệnh đề khác trên if. Bạn có muốn xử lý đặc biệt nếu không có hàng không? –

Trả lời

13

Không .. Không bắt buộc phải kiểm tra (dr.HasRows) nếu DataReader có chứa bất kỳ hàng nào hay không.

Read() sẽ trở lại False nếu không có nhiều hàng để lấy, nhưng Reader.HasRows là nhiều hơn nữa kể như những gì nó hơn Read() nên nó sẽ là một thực hành tốt sử dụng Reader.HasRows bởi vì bạn có thể vô tình làm điều gì đó khác hơn là Read() có thể rơi vào ngoại lệ.

+10

Hãy cẩn thận với HasRows vì nó có thể trả về false khi Read() ** trả về SqlException **, ví dụ: vì có một lỗi trong SQL của bạn hoặc có một sự vi phạm các ràng buộc dữ liệu trên Chèn, v.v. Thông thường bạn cần phải biết nếu thực sự không có hàng hoặc có lỗi. –

+2

@IvanAkcheurov là chính xác. Ngoài các ví dụ của mình, được chọn là một nạn nhân bế tắc sẽ không được biết bằng cách sử dụng HasRows - SqlException không được ném cho đến khi Read() được gọi. – alexg

+0

Hai ý kiến ​​này cuối cùng thay đổi những gì nên là "thực hành tốt", tức là không ngắn mạch 'Read()' với 'HasRows()'. Vì lý do này, tôi đang bỏ phiếu cho câu trả lời. –

1

Tôi nghĩ rằng đây là chủ yếu cho các thủ tục được lưu trữ mà có thể hoặc có thể không có dữ liệu (một hoặc nhiều bộ kết quả) và "dễ dàng hơn" để kiểm tra đầu tiên trong trường hợp bạn cũng làm các công cụ khác ngoài vòng lặp while (tức là khởi tạo đầu trang/chân trang, v.v. khi có dữ liệu).

2

Không bắt buộc phải kiểm tra xem DataReader có hàng (dr.HasRows) hay không. Phương thức Read() sẽ trả về true nếu có nhiều dữ liệu hơn để đọc và false nếu không có nhiều dữ liệu hơn, do đó phá vỡ vòng lặp while.

-4

thử

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

ý kiến ​​của bạn cần

+0

Khai báo các biến tại trang web sử dụng đầu tiên và vui lòng sử dụng câu lệnh 'using'. Đã bỏ phiếu. –

5

Cẩn thận đấy. HasRows() trả về false cho truy vấn CTE của tôi, mặc dù có các hàng (437 hàng thực sự).