2011-01-07 7 views
3

Ich versuche ein Anmeldeformular auf meiner ASP.NET-Website zu erstellen. Derzeit gibt es ein Problem. Ich versuche, die Funktionalität so einzubauen, dass der eingeloggte Benutzer das Vorrecht hat, nur sein Profil zu sehen. Der Code auf der Login-Seite ist dies:.Ungültiger Leseversuch, wenn keine Daten in dr vorhanden sind

business.clsprofiles obj = new business.clsprofiles(); 
     Int32 a = obj.logincheck(TextBox3.Text, TextBox4.Text); 
     if (a == -1) 
     { 
      Label1.Text = "Username/Password incorrect"; 
     } 
     else 
     { 
      Session["cod"]= a; 
      Response.Redirect("profile.aspx"); 
     } 

Nach der Anmeldung wird der Benutzer auf der Seite bewegt, wo die Person sein Profil einmal angemeldet anzeigen kann Session wird persönlich den Wert korrekt des angemeldeten Erhalt von die Login-Seite und übertrage sie erfolgreich auf die nächste Seite. Aber hier auf dieser Profilseite ein Fehler auftritt, und ich denke, es gibt Problem irgendwo in der grid_bind() Methode unter

public void grid_bind() 
{ 
    business.clsprofiles obj = new business.clsprofiles(); 
    List<business.clsprofilesprp> objprp = new List<business.clsprofilesprp>(); 
    Int32 z = Convert.ToInt32(Session["cod"]); 
    objprp = obj.fnd_profiles(z); //This line of code is passing an integer as required but does not get the desired result from the database 
    GridView1.DataSource = objprp; 
    GridView1.DataBind(); 
} 

Da der Fehler in Business-Logik sagt, „ungültig Versuch zu lesen, wenn keine Daten vorhanden in dr“

public List<clsprofilesprp> fnd_profiles(Int32 id) 
     { 
      if (con.State == ConnectionState.Closed) 
      { 
       con.Open(); 
      } 
      SqlCommand cmd = new SqlCommand("fndpro", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add("@id", SqlDbType.Int).Value = id; 
      SqlDataReader dr = cmd.ExecuteReader(); 
      List<clsprofilesprp> obj = new List<clsprofilesprp>(); 
      while(dr.HasRows) 
      { 
       clsprofilesprp k = new clsprofilesprp(); 

       k.id = Convert.ToInt32(dr[0]);//Something wrong here? 

       k.name = dr[1].ToString(); 
       k.password = dr[2].ToString(); 
       k.description = dr[3].ToString(); 
       k.created = Convert.ToDateTime(dr[4]); 
       k.modified = Convert.ToDateTime(dr[5]); 
       obj.Add(k); 
      } 
      dr.Close(); 
      cmd.Dispose(); 
      con.Close(); 
      return obj; 
     }lesprp k = new clsprofilesprp(); 

     k.id = Convert.ToInt32(dr[0]);//Something wrong here? 

       k.name = dr[1].ToString(); 
       k.password = dr[2].ToString(); 
       k.description = dr[3].ToString(); 
       k.created = Convert.ToDateTime(dr[4]); 
       k.modified = Convert.ToDateTime(dr[5]); 
       obj.Add(k); 
      } 
      dr.Close(); 
      cmd.Dispose(); 
      con.Close(); 
      return obj; 
+0

möglich Duplikat von [Ungültiger Leseversuch, wenn keine Daten vorhanden sind] (http://stackoverflow.com/questions/1147615/invalid-attempt-to-read-when-no-data-is-present) –

Antwort

11

Sie haben DataReader.Read zu nennen das Ergebnis zu holen:

SqlDataReader dr = cmd.ExecuteReader(); 
dr.Read(); 
// ... 

DataReader.Read gibt einen boolean, so dass, wenn Sie mehr als 1 Ergebnis haben, können Sie tun:

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

Außerdem Sie‘ versuchen, Zugriff auf die dr-Daten, wenn gibt es keine in diesem Teil des Codes:

k.id = Convert.ToInt32(dr[0]);//Something wrong here? 
k.name = dr[1].ToString(); 
k.password = dr[2].ToString(); 
k.description = dr[3].ToString(); 
k.created = Convert.ToDateTime(dr[4]); 
k.modified = Convert.ToDateTime(dr[5]) 
0

Sie versuchen, eine Zeile in dem Datareader zuzugreifen, obwohl es keine Zeilen sind. d. h. Wenn der Dr nicht in die while-Schleife eintritt, dann gibt es keine Zeilen im Datenreader, jedoch greifen Sie immer noch auf die Felder zu, in denen Sie einen Kommentar "// Irgendwas falsch hier?"

3

Sie haben ein Problem mit ...

while (dr.HasRows) 
{ 
    /* If this loop is entered, it will run 
    * indefinitely until the datareader miraculously 
    * loses all its rows in a hole somewhere */ 
} 

Dies wird entweder nie betreten, bekam oder wird eine Endlosschleife schaffen ... es ist entweder bekam keine Zeilen oder es hat Reihen. Was ich denke, Sie meinte, war:

while (dr.Read()) 
{ 
    /* Do something with the current record */ 
} 

dr.Read() Schleifen zum nächsten Datensatz und gibt wahr oder falsch, je nachdem ob es einen Datensatz gelesen werden soll oder nicht. Wenn der Datenleser initialisiert wird, ist der erste Datensatz nicht ausgewählt. Sie muss ausgewählt werden, indem dr.Read() aufgerufen wird, die dann true zurückgibt, wenn eine erste Zeile gefunden wird, und tatsächlich True zurückgibt, bis Read() aufgerufen wird, wenn sich aktuell in der letzten Zeile befindet, d. H. Es sind keine Zeilen mehr zu lesen.

dr.HasRows ist nur eine Eigenschaft, die Ihnen sagt, ob der Datenreader Zeilen enthält ... was, wenn dies der Fall ist, Zeilen von hier bis zur Ewigkeit behalten wird. Zum Beispiel würden Sie dies verwenden, wenn Sie etwas in dem Fall tun wollten, wenn es Zeilen und etwas anderes in dem Fall hat, dass es nicht hat:

if (dr.HasRows) 
{ 
    while (dr.Read()) 
    { 
     /* Display data for current row */ 
    } 
} 
else 
{ 
    Console.WriteLine("I didn't find any relevant data."); 
} 
Verwandte Themen