【问题标题】:The parameterized query ... expects the parameter ... which was not supplied参数化查询 ... 需要参数 ... 未提供
【发布时间】:2011-04-24 11:20:54
【问题描述】:

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

我正在对其进行测试,因此只需从下拉列表 (ddlID) 中选择用户 ID。

每当更改 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”列已经有用户 ID,这意味着特定的插槽不可用。

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

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 click 事件,PCS1 立即变为 null。

可能是什么问题?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    如果我很理解你的问题:

    ASP.NET 的工作方式与其他 Web 语言一样断开连接。所以我认为当您触发btnSubmit_Click 时,您在ddlID_SelectedIndexChanged 事件中填写的变量已经消失了

    在这两个事件之间,变量消失了。您有multiple ways 来存储您想要的值,例如在页面中的hidden fieldsession 变量中..

    【讨论】:

    • 好的。我会尝试会话。但它不是全局变量吗?
    【解决方案2】:

    如果给参数传递空值,即使添加了参数也会出现这个错误 所以尝试检查该值,如果它为空,则使用 DBNull.Value 属性

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多