如何检查SQLDataReader是否没有行

42
我正在尝试确定如何检查我的 SqlDataReader 是否为 null 或没有行(表示预订不存在),然后显示一个消息框。出于某种原因,当我调试时它会在不返回结果的情况下跳出 While dr.Read()) 代码。
我尝试将此代码放置在几个不同的位置,但如果没有记录返回,则似乎没有任何位置触发消息框。
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! ");
}

保持循环不变,但在其周围包装一个 If 语句以检查 if (dr.HasRows) {}。 - MethodMan
不,我的SqlDataReader的“HasRows”属性被设置为true...但实际上没有加载任何行。 - Mike Gledhill
4个回答

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

SqlDataReader.HasRows 属性


1
谢谢,这个方法可行。我之前一直在使用hasrows属性,可能是用错了。 - Tim

5
将以下代码添加到您的程序中以进行检查:
sqlCommand cmd = new sqlCommand();
SqlDataReader dr = cmd.ExecuteReader();

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

2

HasRows属性可能会对您有所帮助。

属性值

类型:System.Boolean 如果SqlDataReader包含一行或多行,则为true;否则为false。


1
由于某种原因,当我调试时,一旦它到达while dr.Read()代码,如果没有返回结果,它就会跳出。
我认为你在这里看到的是,如果没有下一个记录或者在这种情况下没有第一条记录可读,则SQLDataReader.Read()会返回false
正如其他人所回答的那样,使用HasRows属性来确定结果集中是否有任何行。根据您需要完成的任务,您可能希望利用Read()确实在空结果集的第一次调用时返回false的事实。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接