2009-07-18 20 views
56
private void button1_Click(object sender, EventArgs e) 
    { 
     string name; 
     name = textBox5.Text; 
     SqlConnection con10 = new SqlConnection("con strn"); 
     SqlCommand cmd10 = new SqlCommand("select * from sumant where [email protected]"); 
     cmd10.Parameters.AddWithValue("@name",name); 
     cmd10.Connection = con10; 
     cmd10.Connection.Open();//line 7 
     SqlDataReader dr = cmd10.ExecuteReader(); 
    } 

    if (textBox2.Text == dr[2].ToString()) 
    { 
     //do something; 
    } 

Khi tôi gỡ lỗi cho đến khi dòng 7, nó là ok nhưng sau khi dr đó ném một ngoại lệ: Invalid attempt to read when no data is present. Đó không phải là tốt như tôi có dữ liệu trong bảng với tên người dùng = sumant. Vui lòng cho tôi biết câu lệnh 'if' có chính xác hay không .........nỗ lực không hợp lệ để đọc khi không có dữ liệu hiện diện

Và làm cách nào để xóa lỗi ??

Trả lời

128

Bạn phải gọi DataReader.Read để lấy kết quả:

SqlDataReader dr = cmd10.ExecuteReader(); 
if (dr.Read()) 
{ 
    // read data for first record here 
} 

DataReader.Read() trả về một bool cho thấy nếu có nhiều khối dữ liệu để đọc, vì vậy nếu bạn có nhiều hơn 1 kết quả, bạn có thể làm:

while (dr.Read()) 
{ 
    // read data for each record here 
} 
+4

bên cạnh đó, bạn có thể muốn thử cho các dữ liệu được null sử dụng dr.IsBDNull (0) –

+0

Câu trả lời này có thể được cải thiện, đoạn đầu tiên không chăm sóc giá trị trả về của 'dr.Read()'. Vì vậy, nếu truy vấn không trả về các bản ghi lỗi là như nhau: "Không hợp lệ để đọc khi không có dữ liệu có mặt". Thay vào đó sử dụng 'if (dr.Read()) {....}' (hoặc một vòng lặp như dưới đây). –

13

Bạn phải gọi dr.Read() trước khi thử đọc bất kỳ dữ liệu nào. Phương thức đó sẽ trả về false nếu không có gì để đọc.

6

tôi sẽ kiểm tra để xem nếu SqlDataReader có hàng trở lại đầu tiên:

SqlDataReader dr = cmd10.ExecuteReader(); 
if (dr.HasRows) 
{ 
    ... 
} 
+0

trong trường hợp của tôi, tôi đã có điều này, và mặc dù tôi đã sử dụng điều này ở nơi khác, trong trường hợp cụ thể này đã tạo ra lỗi này, điều này đã không ngăn chặn lỗi từ sủi bọt. Kết quả truy vấn của tôi có các hàng và người đọc không có dữ liệu. Tôi thực sự không hiểu chuyện gì đang diễn ra. Đã tự xác minh các truy vấn và thông số. – Barry

6

Tôi vừa gặp lỗi này, tôi đã gọi số dr.NextResult() thay vì dr.Read().

+1

chỉ có điều tương tự! Đó là một giờ khó chịu! –

1

Tôi đã sử dụng mã bên dưới và nó hoạt động cho tôi.

String email=""; 
    SqlDataReader reader=cmd.ExecuteReader(); 
    if(reader.Read()){ 
     email=reader["Email"].ToString(); 
    } 

String To=email; 
0

Tôi đã có 2 giá trị có thể chứa giá trị null.

while(dr.Read()) 
{ 
    Id = dr["Id"] as int? ?? default(int?); 
    Alt = dr["Alt"].ToString() as string ?? default(string); 
    Name = dr["Name"].ToString() 
} 

giải quyết vấn đề

Các vấn đề liên quan