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.