Ungültiger Leseversuch, wenn keine Daten vorhanden sind

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

Wenn ich bis Zeile 7 Invalid attempt to read when no data is present. debugge, ist es in Ordnung, aber danach löst dr eine Ausnahme aus: Das ist nicht möglich, da ich Daten in der Tabelle mit dem Benutzernamen = sumant habe. Bitte sagen Sie mir, ob die 'if'-Anweisung korrekt ist oder nicht .........

Und wie entferne ich den Fehler?

Wissensjäger
quelle

Antworten:

176

Sie müssen aufrufen DataReader.Read, um das Ergebnis abzurufen:

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

DataReader.Read()Gibt eine boolAnzeige zurück, wenn mehr Datenblöcke zu lesen sind. Wenn Sie also mehr als ein Ergebnis haben, können Sie Folgendes tun:

while (dr.Read()) 
{
    // read data for each record here
}
Julien Poulin
quelle
4
Außerdem möchten Sie vielleicht versuchen, dass die Daten mit dr.IsBDNull (0)
Luis Robles
Diese Antwort kann verbessert werden, das erste Snippet kümmert sich nicht um den Rückgabewert von dr.Read(). Wenn die Abfrage keine Datensätze zurückgibt, ist der Fehler derselbe: "Ungültiger Leseversuch, wenn keine Daten vorhanden sind". Verwenden Sie stattdessen if(dr.Read()){....}(oder eine Schleife wie unten).
Tim Schmelter
17

Sie müssen anrufen, dr.Read()bevor Sie versuchen, Daten zu lesen. Diese Methode gibt false zurück, wenn nichts zu lesen ist.

Colin Mackay
quelle
9

Ich hatte gerade diesen Fehler, ich rief dr.NextResult()statt dr.Read().

Charlie
quelle
1
hatte gerade genau das gleiche! Das war eine frustrierende Stunde!
JonnyRaa
8

Ich würde überprüfen, ob der SqlDataReader zuerst Zeilen zurückgegeben hat:

SqlDataReader dr = cmd10.ExecuteReader();
if (dr.HasRows)
{
   ...
}
Dougczar
quelle
4
In meinem Fall hatte ich dies, und obwohl ich dies in diesem speziellen Szenario, das diesen Fehler verursachte, an anderer Stelle verwendet habe, hat dies den Fehler NICHT daran gehindert, zu sprudeln. Mein Abfrageergebnis enthält Zeilen, und dennoch hat der Leser keine Daten. Ich verstehe wirklich nicht, was los ist. Ich habe die Abfrage und die Parameter selbst überprüft.
Barry
3

Ich habe den folgenden Code verwendet und es hat bei mir funktioniert.

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

String To=email;
Aneel Goplani
quelle
2

Ich hatte 2 Werte, die Nullwerte enthalten konnten.

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

Das Problem wurde behoben

Dev
quelle