1

行を更新しようとしているグリッドビューがあります。行更新イベントにブレークポイントを設定すると、最初にヒットし、行が正常に更新されます。そのコードをステップ実行し続けると、2 回目のヒットはありませんが、その更新からのストアド プロシージャのパラメーターが多すぎてエラーがスローされるという例外が発生します。

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();
}
4

1 に答える 1

0

次のことを試してください。

onrowupdating="grdvwRecordings_RowUpdating"GridView 属性から削除します

SqlDataSourceタグの を次のように置き換えますUpdateParameters

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

何が起こっているのかと思うと、更新コマンドを GridView で 1 回 (OnRowUpdated属性を使用して) 1 回指定し、SqlDataSource.

編集:
Tim Brooks が以下のコメントで示したよう<%# Eval("Name") %>に、Bind の代わりに使用する必要がありました。これは、バインドされたフィールドがパラメーターとして update コマンドに自動的に追加されていたためです。

また、私が提案した変更を加えることで、あなたの主キーが公開される心配もありません。これは Web アプリであり、GridViewUpdateEventArgs から RecordingID を取得しているため、既に ViewState でユーザーのコンピューターに情報を渡しています。これが受け入れられない場合は、ViewState を暗号化することをお勧めします。顕著なパフォーマンス ヒットが発生する可能性がありますが、ViewState は安全に読み取ることができます。
詳細については、 Page.ViewStateEncryptionMode プロパティASP.NET 2.0での ViewState の暗号化、およびビュー ステートの保護を参照してください。

ViewState の入門書が必要な場合は、この投稿から始めることもできますが、他にも優れたものがたくさんあると確信しています。

于 2012-12-04T02:04:52.723 に答える