如何摆脱“没有给出一个或多个必需参数的值”

我有以下代码,

单击Gridview中的更新按钮时,将引发错误:没有为一个或多个必需参数指定值

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

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请求期间发生未处理的exception。 请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 exception详细信息:System.Data.OleDb.OleDbException:没有为一个或多个必需参数指定值。

源错误:在执行当前Web请求期间生成了未处理的exception。 可以使用下面的exception堆栈跟踪来识别有关exception的起源和位置的信息。 堆栈跟踪:[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(Object&executeResult)+194 System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior,Object&executeResult)+58 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior,String方法)+167 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()+113 System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand command,DataSourceOperation operation)+394 System.Web.UI.WebControls.SqlDataSourceView.ExecuteUpdate(IDictionary keys,IDictionary values,IDictionary oldValues)+697 System.Web.UI.DataSourceView.Update(IDictionary keys,IDictionary values,IDictionary oldValues,DataSourceViewOperationCallback c allback)+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(Object source,EventArgs e)+95 System.Web.UI.Control.RaiseBubbleEvent(Object source,EventArgs args)+37 System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(对象源,EventArgs e)+121 System.Web.UI.Control.RaiseBubbleEvent(Object source,EventArgs args)+37 System.Web.UI.WebControls.LinkBut​​ton.OnCommand(CommandEventArgs e)+125 System.Web.UI.WebControls .LinkBut​​ton.RaisePostBackEvent(String eventArgument)+169 System.Web.UI.WebControls.LinkBut​​ton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String 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 **

请检查代码并帮助我理清这项任务

此致,Arjun

来自OleDbCommand.Parameters :

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

 SELECT * FROM Customers WHERE CustomerID = ? 

因此,请尝试使用未命名的参数(有关完整示例,请参阅文档)。

如果查看下面的链接,请在备注下面写着“使用这些集合的一种常用方法是对用户提供的值进行HTML编码,然后再将它们存储在数据源中。”

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