-3

我有一个返回布尔值的存储过程。(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 到 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;
            }

        }
4

6 回答 6

1

你需要继续Read()做一些事情来处理这些结果。

while (dr.Read())
{

}

你看,该Read()方法返回一个bool. 所以,现在如果你想得到每一行的结果,你可以这样做:

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

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

于 2013-08-19T12:22:37.963 回答
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;
}
于 2013-08-19T12:38:08.950 回答
0

目前还不清楚您的存储过程返回什么,但如果第一行和第一列包含例如一个整数,您也可以忘记阅读器并使用SqlCommands ExecuteScalar 方法,如下所示:

return com.ExecuteScalar() == 1;
于 2013-08-19T12:38:29.043 回答
0

作为dr.Read()回报bool,因此在与int

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

所以把你的代码改成

return dr.Read();

代替

if (dr.Read() == 1)
{
   return true;
}
else
{
   return false;
}
于 2013-08-19T12:21:32.787 回答
0

代替

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

 if (dr.Read())
 {
    return true;
 }
于 2013-08-19T12:21:59.337 回答
-1

如果您需要遍历所有行,试试这个

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

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

于 2013-08-19T12:25:56.117 回答