rowUpdating似乎启动了两次——第二次错误,参数太多



我有一个网格视图,我正试图更新该行。如果我在行更新事件上设置了一个断点,它会第一次被命中,并且行被成功更新。当我继续遍历时,代码没有第二次命中,但是我得到了一个异常,即来自该更新的存储过程的参数太多,并引发了一个错误。

我确实将autoeventwireup设置为true。这是个问题吗?我试着将其设置为false,但在page_load中发生了其他事情,但这些事情没有发生,并破坏了页面。另外,从我读到的内容来看,这可能不是问题所在。非常感谢您的帮助!

这是错误上的堆栈跟踪

[SqlException (0x80131904): Procedure or function RecordingUpdateName has too many arguments specified.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +2084358
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +5096328
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2294
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +215
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +987
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +178
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +137
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 callback) +95
System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow row, Int32 rowIndex, Boolean causesValidation) +1226
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +855
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(Object source, EventArgs e) +121
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +125
System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +169
System.Web.UI.WebControls.LinkButton.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

和:

<asp:GridView ID="grdvwRecordings" runat="server"
DataSourceID="sqldataRecordings"
EmptyDataText="No recordings have been saved. Select Call Now below. "
DataKeyNames="RecordingID"
onrowdeleting="grdvwRecordings_RowDeleting"
onrowupdating="grdvwRecordings_RowUpdating"
onrowediting="grdvwRecordings_RowEditing"
AutoGenerateColumns="False"
onrowdatabound="grdvwRecordings_RowDataBound">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:TemplateField HeaderText="Recording">
<ItemTemplate>
<asp:Label ID="lblRecordingName" Text='<%# Bind("Name") %>' runat="server"></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtRecordingName" Text='<%# Bind("Name") %>' runat="server"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Date Recorded">
<ItemTemplate>
<asp:Label ID="lblDateRecorded" Text='<%# Bind("EntryDate") %>' runat="server"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Duration">
<ItemTemplate>
<asp:Label ID="lblDuration" Text='<%# Bind("Duration") %>' runat="server"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="sqldataRecordings" SelectCommand="[RecordingSelectByClient]"
SelectCommandType="StoredProcedure" runat="server"
ConnectionString="<%$ ConnectionStrings:VB %>"
onselecting="AddClientIDParameter_Selecting"
UpdateCommand="RecordingUpdateName"
UpdateCommandType="StoredProcedure"
DeleteCommand="RecordingDelete"
DeleteCommandType="StoredProcedure">
<UpdateParameters>
<asp:Parameter Name="RecordingName" Type="String" />
<asp:Parameter Name="RecordingID" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>

和:

protected void grdvwRecordings_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
this.sqldataRecordings.UpdateParameters["RecordingID"].DefaultValue = e.Keys["RecordingID"].ToString();
this.sqldataRecordings.UpdateParameters["RecordingName"].DefaultValue = e.NewValues["Name"].ToString();
this.sqldataRecordings.Update();
}

请尝试以下操作:

从GridView属性中删除onrowupdating="grdvwRecordings_RowUpdating"

SqlDataSource标签中,将UpdateParameters替换为:

<UpdateParameters>
<asp:QueryStringParameter Name="RecordingName" QueryStringField="Name" Type="String" />
<asp:QueryStringParameter Name="RecordingID" QueryStringField="RecordingID" Type="String" />
</UpdateParameters>

我认为发生的情况是,您在GridView中指定了一次update命令(使用OnRowUpdated属性),在SqlDataSource中指定了一遍。

编辑:
正如Tim Brooks在下面的评论中所指出的,他需要使用<%# Eval("Name") %>而不是Bind,因为绑定字段会自动作为参数添加到更新命令中。

此外,我不会担心通过进行我建议的更改来暴露您的主键。由于这是一个web应用程序,并且您正在从GridViewUpdateEventArgs获取RecordingID,因此您已经在ViewState中将信息传递给用户的计算机。如果这是不可接受的,我建议您加密ViewState。可能会有明显的性能冲击,但ViewState不会被阅读
请参阅第页。ViewStateEncryptionMode属性,在ASP中加密ViewState。NET 2.0和"保护视图状态"以获取更多信息。

如果你需要一本关于ViewState的入门读物,你可以从这篇文章开始,但我相信还有很多其他的好文章。

相关内容

最新更新