2012-09-26 3 views
19

Próbuję dowiedzieć się, jak sprawdzić, czy mój SqlDataReader jest pusty lub nie ma wierszy (co oznacza, że ​​rezerwacja nie istnieje), a następnie wyświetlić pole wiadomości. Z jakiegoś powodu, gdy debuguję, gdy trafi on kod While dr.Read()), wykracza on, jeśli nie ma wyniku zwrotu.Jak sprawdzić, czy SQLDataReader nie ma wierszy

Próbowałem wprowadzenie tego kodu w kilku różnych miejscach, ale żaden nie wydaje się wystrzelić MessageBox jeśli żadne rekordy są zwracane

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

mój kod ...

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

Trzymaj pętlę tak, jak jest, ale zawiń instrukcję If wokół niej, aby sprawdzić, czy (dr.HasRows) {} – MethodMan

Odpowiedz

31
if(dr.HasRows) 
{ 
    // .... 
} 
else 
{ 
    MessageBox.Show("Reservation Number Does Not Exist","Error", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 
} 

SqlDataReader.HasRows Property

+0

Dzięki temu działałam, używałam własności hasrows, używając po prostu źle, tak myślę. – Tim

2

The HasRows property może ci pomóc.

Własności Wartość

Typ: System.Boolean true jeśli SqlDataReader zawiera jeden lub więcej wiersze; inaczej false.

3

Dodaj do tego kodu do sprawdzenia:

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

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

Z jakiegoś powodu, gdy debugować raz trafi Kodeks while dr.Read() to wychodzi, jeśli nie ma return result

Myślę, że tutaj widzisz, że SQLDataReader.Read() zwraca false, jeśli nie ma następnego, lub w tym przypadku pierwszego rekordu do przeczytania.

Tak, jak inni odpowiedzieli, użyj właściwości HasRows, aby określić, czy w zestawie wyników znajdują się wiersze. Zależnie od tego, co musisz osiągnąć, możesz skorzystać z faktu, że Read() rzeczywiście zwraca przy pierwszym wywołaniu dla pustego zestawu wyników.