Tentative de lecture invalide lorsqu’aucune donnée n’est présente dans dr

J’essaie de créer un formulaire de connexion sur mon site Web ASP.NET. Actuellement, il y a un problème. J’essaie d’intégrer des fonctionnalités telles que l’utilisateur connecté a le previlige pour visualiser uniquement son profil. Le code sur la page de connexion est la suivante:

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

Une fois connecté, l’utilisateur est déplacé vers la page où la personne peut afficher son profil une fois connecté. La session obtient correctement la valeur de la personne connectée à partir de la page de connexion et la transmet avec succès à la page suivante. Mais ici sur cette page de profil une erreur se produit et je pense qu’il ya un problème quelque part dans la méthode grid_bind() ci-dessous

 public void grid_bind() { business.clsprofiles obj = new business.clsprofiles(); List objprp = new List(); 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(); } 

Comme le dit l’erreur dans la logique applicative, “tentative non valide de lecture en l’absence de données dans dr”

 public List 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 obj = new List(); while(dr.HasRows) { clsprofilesprp k = new clsprofilesprp(); k.id = Convert.ToInt32(dr[0]);//Something wrong here? k.name = dr[1].ToSsortingng(); k.password = dr[2].ToSsortingng(); k.description = dr[3].ToSsortingng(); 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].ToSsortingng(); k.password = dr[2].ToSsortingng(); k.description = dr[3].ToSsortingng(); k.created = Convert.ToDateTime(dr[4]); k.modified = Convert.ToDateTime(dr[5]); obj.Add(k); } dr.Close(); cmd.Dispose(); con.Close(); return obj; 

Vous devez appeler DataReader.Read pour récupérer le résultat:

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

DataReader.Read renvoie un booléen, donc si vous avez plus d’un résultat, vous pouvez faire:

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

De plus, vous essayez d’accéder aux données dr alors qu’il n’y en a pas dans cette partie du code:

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

Vous avez un problème avec …

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

Cela n’entrera jamais ou créera une boucle infinie … soit il n’a pas de lignes ou il a des lignes. Ce que je pense que vous vouliez dire était:

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

dr.Read() boucle à l’enregistrement suivant et renvoie true ou false, selon qu’un enregistrement doit être lu ou non. Lorsque le lecteur de données est initialisé, le premier enregistrement n’est pas sélectionné. Il doit être sélectionné en appelant dr.Read() qui retournera alors true si une première ligne est trouvée, et retournera true jusqu’à ce que Read () soit appelé alors qu’il se trouve actuellement sur la dernière ligne – autrement dit, il ne rest plus de lignes à lire. .

dr.HasRows est juste une propriété qui vous indique si le datareader contient des lignes … qui, le cas échéant, continueront à avoir des lignes à partir d’ici jusqu’à l’éternité. Par exemple, vous utiliseriez ceci si vous vouliez faire quelque chose dans le cas où il aurait des lignes et quelque chose d’autre dans le cas où ce ne serait pas le cas:

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

Vous essayez d’accéder à une ligne dans le datareader alors qu’il n’y en a pas. Par exemple, si le dr n’entre pas dans la boucle while, il n’y a pas de lignes dans le datareader, mais vous continuez d’accéder aux champs dans lesquels vous avez un commentaire “// Quelque chose ne va pas ici?”.