向 SQL Server 存储过程传递布尔型参数

4

我之前问过这个问题,当时我认为找到了问题所在,但实际上并没有。我现在遇到一个问题,就是向存储过程传递布尔值参数时出现了问题。以下是我的c#代码:

public bool upload = false;

protected void showDate(object sender, EventArgs e)
{
        if (Radio1.Checked)
        {
            upload = true;
            Radio2.Checked = false;
            date_div.Visible = true;
            date_div2.Visible = false;
        }
}

protected void getMonthList()
{
    selectedYear = year.SelectedValue.ToString();

    SqlConnection connection = new SqlConnection(connString);

    SqlCommand cmd = connection.CreateCommand();
    cmd.CommandType = CommandType.StoredProcedure;

    connection.Open();

    cmd.CommandText = "getMonth";
    cmd.Parameters.Add("@year", SqlDbType.Int, 0).Value = Convert.ToInt32(selectedYear);
    cmd.Parameters.AddWithValue("@upload", upload);

    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter(cmd);

    da.Fill(dt);

    month.DataSource = dt;
    month.DataTextField = "month";
    month.DataValueField = "monthValue";
    month.DataBind();
    month.Items.Insert(0, new ListItem("Select", "0"));
}

以下是存储过程getMonth

ALTER PROCEDURE [dbo].[getMonth] 
    @year int,
    @upload Bit
AS
BEGIN
  IF @upload = 1
  BEGIN
   SELECT distinct datename(mm, Upload_date) month
    ,month (upload_date) monthValue
   FROM dbo.RESOLVED
   WHERE datepart(yyyy, upload_date) = @year
   ORDER by 2
  END
  ELSE
  BEGIN
    SELECT distinct datename(mm, substring(CREATE_DT,1,2) + '.' +      substring(CREATE_DT,3,2) + '.' + substring(CREATE_DT,5,4)) month
    ,month (substring(CREATE_DT,1,2) + '.' + substring(CREATE_DT,3,2) + '.' + substring(CREATE_DT,5,4)) monthValue

    FROM dbo.RESOLVED
    WHERE datepart(yyyy, substring(CREATE_DT,1,2) + '.' + substring(CREATE_DT,3,2) + '.' + substring(CREATE_DT,5,4)) = @year
    ORDER by 2
 END

存储过程应该填充下拉列表。它应该执行IF语句,但是IF被跳过了,相反执行了ELSE。

2
你尝试过传入“1”作为upload参数来测试它是否有效吗? - Arian Motamedi
我刚刚更新了代码,C#代码中的upload变量是全局的,并且有一个初始值false。然后在showDate()中将其赋值为true,但是在getMonthList()中它仍然保持为false。只有在getMonthList()中将upload变量赋值为true时,代码才能正常工作。我不知道为什么会这样。 - gg17
我没有看到代码有任何问题。你可能需要在代码中设置几个断点来找出问题所在。getMonthList() 是在同一个类的实例上调用吗? - Arian Motamedi
@KenWhite,bit 值只能是 0 或 1。这是一个合理的假设。 - user47589
@KenWhite,啊,明白了。 - user47589
显示剩余4条评论
1个回答

1

我倾向于为布尔类型参数指定类型。可能会写成这样:

            SqlParameter param = new SqlParameter();
            param.ParameterName = "@upload";
            param.Value = upload;
            param.DbType = System.Data.DbType.Boolean
            cmd.Parameters.Add(param);

也许还可以使用断点或甚至System.Diagnostics.Debug.Write("@Upload is " + upload)来检查您是否传入了您认为的内容。最后,我建议将您的SqlConnectionSqlCommand语句放在using块中,以确保资源在运行后被清理。

谢谢!我是新手,不知道System.Diagnostics.Debug.Write,它帮了我很大忙。我有另一个方法getYearList(),在调用getMonthList()之前被调用,在那里'upload'保持为true。在调用getYearList()之后,'upload'再次变为false。所以我将代码更改为将'upload'声明为静态的,现在很好了。 - gg17

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