从查询结果中获取所有行

时间:2013-08-19 12:19:20

标签: c# sql sql-server

我有一个返回布尔值的存储过程。 (0或1)。它返回多行。我的问题是如何遍历所有结果。

  using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DBReader"].ConnectionString))
  {
       using (SqlCommand com = new SqlCommand("Reader.usp_CheckerIsStopped", con))
       {
           com.CommandType = CommandType.StoredProcedure;
           com.Parameters.Add("@fld_UserID", SqlDbType.Int).Value = this.UserID;

           con.Open();
           SqlDataReader dr = com.ExecuteReader();

           if (dr.Read() == 1)
           {
               return true;
           }
           else
           {
               return false;
           }
      }
  }

dr.Read() == 1

出错

错误:

  

运算符==无法应用于键入bool to int“

我的存储过程返回包含0或1的多行,我想获取这些值,因为我想检查它是否等于true为false(0或1)

   if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //if (e.Row.Cells[11].Text == "In Progress")
            //{
            //    System.Web.UI.WebControls.ImageButton StartImageButton = (System.Web.UI.WebControls.ImageButton)e.Row.Cells[1].FindControl("StartImageButton");
            //    StartImageButton.Visible = false;
            //}
            gvfunct.UserID = Convert.ToInt32(Session["UserID"]);
            gvfunct.CheckIsStopped();
            if (gvfunct.CheckIsStopped() == true)
            {
                System.Web.UI.WebControls.ImageButton StartImageButton = (System.Web.UI.WebControls.ImageButton)e.Row.Cells[2].FindControl("StartImageButton");
                StartImageButton.Visible = true;
                System.Web.UI.WebControls.ImageButton StopImageButton = (System.Web.UI.WebControls.ImageButton)e.Row.Cells[1].FindControl("StopImageButton");
                StopImageButton.Visible = false;
            }
            else
            {
                System.Web.UI.WebControls.ImageButton StopImageButton = (System.Web.UI.WebControls.ImageButton)e.Row.Cells[1].FindControl("StopImageButton");
                StopImageButton.Visible = true;
                System.Web.UI.WebControls.ImageButton StartImageButton = (System.Web.UI.WebControls.ImageButton)e.Row.Cells[2].FindControl("StartImageButton");
                StartImageButton.Visible = false;
            }

        }

6 个答案:

答案 0 :(得分:1)

您需要继续Read()并对这些结果采取措施。

while (dr.Read())
{

}

您看,Read()方法返回bool。所以,现在如果你想得到每一行的结果,你可能会做这样的事情:

while (dr.Read())
{
    var val = dr.GetInt32(0);
}

这将从Read()中您当前所在的行获取第一列的值,并将其转换为int。当然,如果您尝试投射string或其他内容,该行可能会出错。考虑一个事实:DataReader是一个只读,仅向前的数据缓冲区。它实际上一次只从服务器中提取一行数据,从而在Read()操作期间保持连接打开,直到它超出范围。

答案 1 :(得分:0)

dr.Read()返回bool时,您在与int进行比较时会收到错误

如果SqlDataReader有行,则返回true,否则返回false。

所以将代码更改为

return dr.Read();

而不是

if (dr.Read() == 1)
{
   return true;
}
else
{
   return false;
}

答案 2 :(得分:0)

替换

if (dr.Read() == 1)
{
    return true;
}

 if (dr.Read())
 {
    return true;
 }

答案 3 :(得分:0)

你需要显式地转换它或者只是使用它的正确布尔类型 因此,您可以使用if (dr.Read() == 1)if (dr.Read() == true)

代替if (dr.Read())

没有我所知道的直接演员,例如(bool)1不起作用,但你可能总是使用Convert.ToBoolean(1)或其他一些方法来转换它

您也可以创建自己的自定义投射方法

IntToBool (int bool)
{
  if(bool == 1) return true;
  return false;
}

答案 4 :(得分:0)

您的存储过程返回的内容并不是很清楚,但如果第一行和第一列包含例如一个整数,您也可能会忘记阅读器并使用SqlCommands ExecuteScalar-method,如下所示:

return com.ExecuteScalar() == 1;

答案 5 :(得分:-1)

如果您需要遍历所有行,请尝试此

if(dr.Read()){
 if(dr.Read()) return true;
 else return false;
}
else return false;

这将读取dr两次,如果找到2行则返回true。如果找到0或1行,则返回false。