参数化查询...期望参数...未提供

时间:2011-04-24 11:20:54

标签: c# asp.net

我试图用复选框创建一个简单的数据表单。它就像一个职责申请表,其中复选框代表每个职责空缺。

我正在测试它,因此只需从下拉列表(ddlID)中选择userID。

每当更改ddlID的选定索引时,从数据库中提取职责数据并向表格用户显示,因此用户可以请求可用的插槽或在他/她之前请求时释放插槽。如果某人之前已经请求了某个特定的广告位,则该特定的复选框将被禁用。

以下是我页面背后的代码。

string PCS1, R1S1 = "somevalue";
    protected void Page_Load(object sender, EventArgs e)
    {
        lblDate.Text = DateTime.Now.ToLongDateString();
    }
    protected void ddlID_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString);
            SqlCommand cmd = sqlConn.CreateCommand();

            cmd.CommandText = "SELECT * FROM tbl_duty_location WHERE Shift = 'S1'";

            sqlConn.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    if (reader["PC"].ToString() == "n")
                    {
                        PCS1 = "n";
                    }
                    else if (reader["PC"].ToString() != "n")
                    {
                        PCS1 = reader["PC"].ToString();
                    }

                    if (reader["R1"].ToString() == "n")
                    {
                        R1S1 = "n";
                    }
                    else if (reader["R1"].ToString() != "n")
                    {
                        R1S1 = reader["R1"].ToString();
                    }

                }
            }

            if (PCS1 == ddlID.SelectedItem.ToString())
            {
                chkPCS1.Enabled = true;
                chkPCS1.Checked = true;
            }
            else if (PCS1 == "n")
            {
                chkPCS1.Enabled = true;
                chkPCS1.Checked = false;
            }
            else if (PCS1 != ddlID.SelectedItem.ToString())
            {
                chkPCS1.Enabled = false;
                chkPCS1.Checked = false;
            }

            if (R1S1 == ddlID.SelectedItem.ToString())
            {
                chkR1S1.Enabled = true;
                chkR1S1.Checked = true;
            }
            else if (R1S1 == "n")
            {
                chkR1S1.Enabled = true;
                chkR1S1.Checked = false;
            }
            else if (R1S1 != ddlID.SelectedItem.ToString())
            {
                chkR1S1.Enabled = false;
                chkR1S1.Checked = false;
            }
            reader.Close();
            sqlConn.Close();
        }
    }
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        if (chkPCS1.Enabled == false)
        {
            Trace.Write("PCS1 is: ", PCS1);
        }
        else if (chkPCS1.Checked == false)
        {
            PCS1 = "n";
        }
        else if (chkPCS1.Checked)
        {
            PCS1 = ddlID.SelectedItem.ToString();
        }

        if (chkR1S1.Enabled == false)
        {
            Trace.Write("R1S1: ", R1S1);
        }
        else if (chkR1S1.Checked == false)
        {
            R1S1 = "n";
        }
        else if (chkR1S1.Checked)
        {
            R1S1 = ddlID.SelectedItem.ToString();
        }

        SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConn"].ConnectionString);
        SqlCommand cmd = sqlConn.CreateCommand();

        cmd.CommandText = "UPDATE tbl_duty_location SET PC = @PC1, R1 = @R1 WHERE Shift = '1'";
        cmd.Parameters.AddWithValue("PC1", PCS1);
        cmd.Parameters.AddWithValue("R1", R1S1);

        sqlConn.Open();
        cmd.ExecuteNonQuery();
        sqlConn.Close();
    }

目前,在表中,列“PC”已经具有userID,这意味着特定的插槽不可用。

但是,当我尝试使用不同的userID请求另一个插槽时,我收到了以下错误。

The parameterized query '(@PC1 nvarchar(4000),@R1 nvarchar(9))UPDATE tbl_duty_location SE' expects the parameter '@PC1', which was not supplied.

实际上,@ PC1应该是从数据库加载的PCS1,但是一旦发生btn_submit点击事件,PCS1立即变为空。

可能是什么问题?

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题:

ASP.NET像其他网络语言一样工作。因此,当您触发ddlID_SelectedIndexChanged

时,我认为btnSubmit_Click事件中填充的变量已消失

在两个事件之间,变量消失了......您可以multiple ways将所需的值存储在页面的hidden field中,例如session变量中。

答案 1 :(得分:0)

如果将null值传递给参数,即使添加参数,也会出现此错误 所以尝试检查值,如果为null,则使用DBNull.Value属性

这会将对象图层的空值转换为数据库可接受的DBNull值。