【问题标题】:How to get rid of "No value given for one or more required parameters"如何摆脱“没有为一个或多个必需参数提供值”
【发布时间】:2012-03-14 23:25:52
【问题描述】:

我有以下代码,

当Gridview中的更新按钮被点击时,它会抛出一个error: No value given for one or more required parameters

但是再次运行时可以看到新更新的数据,甚至更新了数据库。

string updateSql = "UPDATE RateCenters SET RateCenterName = @RateCenterName, Province = @Province, QuantityThreshold = @QuantityThreshold" + " WHERE RateCenterID= @RateCenterID";

    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {


        GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];

        DropDownList ddl = (DropDownList)row.FindControl("DropDownList2"); // assigning the dropdownlist item to 'ddl'

        TextBox rateCenterName = (TextBox)row.FindControl("txtRateCenterName"); // assigning textbox input item

        TextBox quantityThreshold = (TextBox)row.FindControl("txtQuantityThreshold"); // assigning textbox input item

        Label ratecenterid = (Label)row.FindControl("Label1"); // assigning the label value

        //  OleDbConnection conn = new OleDbConnection(ConfigurationManager.ConnectionStrings["DBConnection"].ToString());

        string scon = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\arjun.giridhar\my documents\visual studio 2010\Projects\BillingApplicationNew\BillingApplicationNew\App_Data\db1.mdb;Persist Security Info=False";

        OleDbConnection conn = new OleDbConnection(scon);


        try
        {
            OleDbCommand cmd = new OleDbCommand(updateSql, conn);

            cmd.CommandText = updateSql;

            cmd.Parameters.Add("@RateCenterName", OleDbType.VarChar).Value = rateCenterName.Text;
            cmd.Parameters.Add("@Province", OleDbType.VarChar).Value = ddl.SelectedItem.Text;
            cmd.Parameters.Add("@QuantityThreshold", OleDbType.Integer).Value = Convert.ToInt32(quantityThreshold.Text);
            cmd.Parameters.Add("@RateCenterID", OleDbType.Integer).Value = Convert.ToInt32(ratecenterid.Text);

               conn.Open();

                cmd.ExecuteNonQuery();

                GridView1.EditIndex = -1; //refreshing
                GridView1.DataBind();
            }         

            catch (OleDbException ex)
            {
                throw (ex);
            }

            finally
            {
                conn.Close();
                conn.Dispose();
            }

以下是上述错误的堆栈跟踪:

没有为一个或多个必需参数指定值。 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.Data.OleDb.OleDbException:没有为一个或多个必需参数提供值。

来源错误: 在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。 堆栈跟踪: [OleDbException (0x80040e10): 没有为一个或多个必需参数提供值。] System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) +1070856 System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) +247 System.Data.OleDb.OleDbCommand.ExecuteCommandText(对象和执行结果)+194 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior 行为,Object& executeResult)+58 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior 行为,字符串方法)+167 System.Data.OleDb.OleDbCommand.ExecuteNonQuery() +113 System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand 命令,DataSourceOperation 操作)+394 System.Web.UI.WebControls.SqlDataSourceView.ExecuteUpdate(IDictionary 键,IDictionary 值,IDictionary oldValues)+697 System.Web.UI.DataSourceView.Update(IDictionary 键、IDictionary 值、IDictionary oldValues、DataSourceViewOperationCallback 回调)+95 System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean CauseValidation) +1226 System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean CauseValidation, String validationGroup) +716 System.Web.UI.WebControls.GridView.OnBubbleEvent(对象源,EventArgs e)+95 System.Web.UI.Control.RaiseBubbleEvent(对象源,EventArgs args)+37 System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(对象源,EventArgs e)+121 System.Web.UI.Control.RaiseBubbleEvent(对象源,EventArgs args)+37 System.Web.UI.WebControls.LinkBut​​ton.OnCommand(CommandEventArgs e) +125 System.Web.UI.WebControls.LinkBut​​ton.RaisePostBackEvent(字符串 eventArgument)+169 System.Web.UI.WebControls.LinkBut​​ton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 eventArgument)+9 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +176 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563**

请检查代码并帮助我整理此任务

问候, 阿琼

【问题讨论】:

  • Parameter has no default value 的可能重复项
  • 正如错误听起来 tbh :一个或多个值没有被传递。一点点调试将有助于在这里找到罪魁祸首。但是,由于 PageLoad 重新绑定条目,我的钱在下拉框中丢失了条目...
  • @AliIssa 尝试调试,无法解决。

标签: c# asp.net


【解决方案1】:

来自OleDbCommand.Parameters

当 CommandType 设置为 Text 时,OLE DB .NET 提供程序不支持将参数传递给 SQL 语句或由 OleDbCommand 调用的存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。例如:

SELECT * FROM Customers WHERE CustomerID = ?

因此请尝试使用未命名的参数(请参阅文档以获取完整示例)。

【讨论】:

  • @Ravia:目前还不清楚 OP 的含义是什么——我认为这是一种不清楚的说法,即“但我正在指定所有参数”。
  • @Jon Skeet:我已经编辑过了,但错误还是一样!
  • @ArjunBabu:您能否澄清一下您所说的“但字段在更新事件中已更新”是什么意思?您的意思是它们正在在数据库中被更改吗?您能否发布完整异常堆栈跟踪和消息以及编辑后的代码?
  • @JonSkeet:字段已更新,并且在第二次运行期间可以看到新的更新数据,但是当单击更新按钮时,它会抛出此错误“没有为一个或多个必需参数提供值”
  • @ArjunBabu 你的更新按钮事件中有什么?
【解决方案2】:

如果您查看下面的链接,在备注下它说“使用这些集合的一种常见方法是在用户提供的值存储到数据源之前对其进行 HTML 编码。”

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowupdating.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多