2012-09-26 65 views
19

我想弄清楚如何检查我的SqlDataReader是否为空或没有行(表示保留不存在),然后显示一个消息框。出于某种原因,当我调试一次它遇到While dr.Read())代码时,如果它没有返回结果,它将跳出。如何检查SQLDataReader是否没有行

我试图把这个代码在几个不同的地点,但没有人可以关火消息框,如果没有记录返回

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

我的代码...

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

保持你的循环的方式,但它周围包裹If语句来检查是否(dr.HasRows){} – MethodMan

回答

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

SqlDataReader.HasRows Property

+0

感谢这工作我使用hasrows属性只是使用它我猜错了。 – Tim

2

The HasRows property可能会帮助你。

属性值

类型:如果SqlDataReader中包含一个或多个 行System.Boolean真实的;否则为false。

3

添加到您的代码来检查:

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

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

出于某种原因,当我调试,一旦碰到它走出了while dr.Read()代码,如果它没有返回结果

我想你在这里看到的是SQLDataReader.Read()返回false如果没有下一个,或在这种情况下,第一个记录要读取。

与其他人一样,使用HasRows属性来确定结果集中是否有任何行。根据您需要完成的工作,您可能需要利用Read()确实第一次调用空结果集时返回false这一事实。