web-dev-qa-db-fra.com

Comment vérifier si SQLDataReader n'a pas de lignes

J'essaie de comprendre comment vérifier si mon SqlDataReader est nul ou n'a pas de lignes (ce qui signifie que la réservation n'existe pas), puis afficher une boîte de message. Pour une raison quelconque, lorsque je débogue une fois qu'il frappe le code While dr.Read()), il disparaît s'il n'a pas de résultat de retour.

J'ai essayé de mettre ce code à différents endroits, mais aucun ne semble déclencher la boîte de message si aucun enregistrement n'est retourné

if (dr.GetValue(0) == DBNull.Value || !dr.HasRows)
{
    MessageBox.Show("Reservation Number Does Not Exist","Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
else
{
    (read records)
}   

Mon code ...

try
{
   using (SqlConnection con = new SqlConnection(connectionString))
   {
      using (SqlCommand cmd = con.CreateCommand())
      {
         con.Open();
         cmd.CommandText = "usp_StoredProcedureName";
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.Parameters.AddWithValue("@regnum", regnumber);

         using (SqlDataReader dr = cmd.ExecuteReader())
         {
             //Loop through all the rows, retrieving the columns you need.
             while (dr.Read())
             {
                 lblConf.Text = dr.GetValue(0).ToString();
                 lblName.Text = dr.GetValue(1).ToString() + "," + dr.GetValue(2);
                 lblCompany.Text = dr.GetValue(3).ToString();
                 lblStatus.Text = dr.GetValue(4).ToString();
             }
         }
      }
   }
}
catch (Exception ex)
{
    MessageBox.Show("Can not open connection! ");
}
26
Tim
if(dr.HasRows)
{
    // ....
}
else
{
    MessageBox.Show("Reservation Number Does Not Exist","Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}

propriété SqlDataReader.HasRows

38
Tim Schmelter

Ajoutez ceci à votre code pour vérifier:

sqlCommand cmd = new sqlCommand();
SqlDataReader dr = cmd.ExecuteReader();

if(dr.HasRows)
{
    while(dr.Read())
    {
        //code
    }
}
3
Moslem7026

La propriété HasRows peut vous aider.

Valeur de la propriété

Type: System.Boolean true si le SqlDataReader contient une ou plusieurs lignes; sinon faux.

2
David B

Pour une raison quelconque, lorsque je débogue une fois qu'il atteint le code while dr.Read(), il disparaît s'il n'a pas de résultat de retour

Je pense que ce que vous voyez ici est que SQLDataReader.Read() renvoie false s'il n'y a pas de suivant, ou dans ce cas un premier enregistrement à lire.

Comme d'autres l'ont répondu, utilisez la propriété HasRows pour déterminer si vous avez des lignes dans le jeu de résultats. Selon ce que vous devez accomplir, vous souhaiterez peut-être tirer parti du fait que Read() renvoie en effet false la première fois qu'il est appelé pour un jeu de résultats vide.

1
Bob Kaufman