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?

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
}

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.


9

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


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)
{
   ...
}

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;

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.