Nieprawidłowa próba odczytu, gdy nie ma żadnych danych


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

Kiedy debuguję do linii 7, wszystko jest w porządku, ale po tym dr zgłasza wyjątek: Invalid attempt to read when no data is present. Nie jest to możliwe, ponieważ mam dane w tabeli z nazwą użytkownika = sumant. Proszę, powiedz mi, czy stwierdzenie „jeśli” jest poprawne, czy nie…

A jak mam usunąć błąd?

Odpowiedzi:


176

Musisz zadzwonić, DataReader.Readaby pobrać wynik:

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

DataReader.Read()zwraca boolwskaźnik wskazujący, czy jest więcej bloków danych do odczytania, więc jeśli masz więcej niż 1 wynik, możesz wykonać:

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

4
poza tym możesz spróbować, aby dane były zerowe, używając dr.IsBDNull (0)
Luis Robles

Tę odpowiedź można poprawić, pierwszy fragment kodu nie uwzględnia zwracanej wartości dr.Read(). Więc jeśli zapytanie nie zwraca rekordów, błąd jest taki sam: „Nieprawidłowa próba odczytu, gdy nie ma żadnych danych”. Zamiast tego użyj if(dr.Read()){....}(lub pętli jak poniżej).
Tim Schmelter,

17

Musisz zadzwonić dr.Read()przed próbą odczytania jakichkolwiek danych. Ta metoda zwróci wartość false, jeśli nie ma nic do odczytania.


9

Po prostu miałem ten błąd, dzwoniłem dr.NextResult()zamiast dr.Read().


1
miałem dokładnie to samo! To była frustrująca godzina!
JonnyRaa

8

Chciałbym sprawdzić, czy SqlDataReader zwraca najpierw wiersze:

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

4
w moim przypadku miałem to i chociaż używałem tego w innym miejscu, w tym konkretnym scenariuszu, który spowodował ten błąd, NIE powstrzymało to bulgotania błędu. Wynik mojego zapytania zawiera wiersze, a mimo to czytnik nie ma danych. Naprawdę nie rozumiem, co się dzieje. Sam zweryfikowałem zapytanie i parametry.
Barry

3

Użyłem poniższego kodu i zadziałał.

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

String To=email;

2

Miałem 2 wartości, które mogą zawierać wartości null.

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

rozwiązał problem

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.