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