Cố gắng đọc không hợp lệ khi không có dữ liệu


80
    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 username=@name");
        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 dòng 7, nó không sao nhưng sau đó dr ném ra một ngoại lệ: Invalid attempt to read when no data is present. Điều đó là không thể vì 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ó đúng hay không .........

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

Câu trả lời:


176

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 boolcho biết nếu có nhiều khối dữ liệu hơn để đọc, vì vậy nếu bạn có nhiều hơn 1 kết quả, bạn có thể thực hiện:

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)
— Luis Robles

Câu trả lời này có thể được cải thiện, đoạn mã đầu tiên không quan tâm đến 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 giống nhau: "Cố gắng đọc không hợp lệ khi không có dữ liệu nào". Thay vào đó hãy sử dụng if(dr.Read()){....}(hoặc một vòng lặp như bên dưới).
— Tim Schmelter

17

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


9

Tôi chỉ gặp lỗi này, tôi đang gọi dr.NextResult()thay vì dr.Read().


1
chỉ có cùng một điều chính xác! Đó là một giờ khó chịu!
— JonnyRaa

8

Tôi sẽ kiểm tra xem SqlDataReader có các hàng được trả về trước hay không:

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

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

3

Tôi đã sử dụng mã dưới đây và nó đã làm việc cho tôi.

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

String To=email;

2

Tôi đang có 2 giá trị có thể chứa giá trị rỗng.

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 đề

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.