0

ここに画像の説明を入力

私は古いウェブサイトを維持していますが、コードはかなり面倒でした。

SqlDataSource を使用して、更新、選択、挿入機能を実行したいと考えています。バックエンドのコードを自分で書きたくありません。(実際にはすべてのコードをすでに書いていますが、古いコードはテストするには面倒でコメントがないため、バグがどこにあるかを検出するのが非常に難しいため、バックエンド コードを破棄し、SqlDataSource を使用しています)

代わりに、更新には SqlDataSource の UpdateCommand を使用したいと思います。 ここに私の更新クエリがあります:

UPDATE MedicareLocalAccounts SET Account=@Account and PWD=@PWD WHERE DivisionID=@DivisionID

データ ソースは 3 つの異なるテーブルから取得されます。

 <asp:GridView ID="gv_MediCareLocals" runat="server" AllowPaging="True" AllowSorting="True"
            AutoGenerateColumns="False" DataKeyNames="LUDivisionsUID" ClientIDMode="Static" AutoGenerateEditButton="True"
            EnablePersistedSelection="True" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:HyperLinkField DataTextField="LUDivisionsUID" HeaderText="Division ID" ShowHeader="true"
                    SortExpression="LUDivisionsUID" />
                <asp:BoundField DataField="Division" HeaderText="Medicare Local" ReadOnly="true" SortExpression="Division"/>
                <asp:BoundField DataField="States" HeaderText="State" ReadOnly="true" SortExpression="States" />

                <asp:TemplateField HeaderText="Account">
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("Account") %>' />
                    </ItemTemplate>
                    <EditItemTemplate>
                        <input type="text" clientidmode="Static" runat="server" id="tbAccount" value='<%# Eval("Account") %>' />
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Password">
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("PWD") %>' />
                    </ItemTemplate>
                    <EditItemTemplate>
                        <input type="text" clientidmode="Static" runat="server" id="tbPassword" value='<%# Eval("PWD") %>' />
                    </EditItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

ご覧のとおり、DivisionID もパラメーター化する必要がありますが、DivisionID フィールドには ID がありません (アカウントやパスワードとは異なります)。では、現在の行で DivisionID を見つけるために where 句を記述するにはどうすればよいでしょうか?

更新: DivisionID 列をに変更しました

  <asp:TemplateField HeaderText="DivisionID" SortExpression="LUDivisionsUID" >
                        <ItemTemplate>
                            <asp:Label runat="server" ID="lblDivisionID" Text='<%# Eval("LUDivisionsUID") %>'>' ></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>

しかし、更新ボタンをクリックした後、エラーが発生しました。

ControlParameter 'Account' にコントロール 'tbAccount' が見つかりませんでした。

説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.InvalidOperationException: ControlParameter 'Account' にコントロール 'tbAccount' が見つかりませんでした。

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[InvalidOperationException: ControlParameter 'Account' にコントロール 'tbAccount' が見つかりませんでした。]
System.Web.UI.WebControls.ControlParameter.Evaluate(HttpContext コンテキスト、コントロール コントロール) +2155166
System.Web.UI.WebControls.Parameter.UpdateValue(HttpContextコンテキスト、コントロール コントロール) +50
System.Web.UI.WebControls.ParameterCollection.UpdateValues(HttpContext コンテキスト、コントロール コントロール) +101
System.Web.UI.WebControls.ParameterCollection.GetValues(HttpContext コンテキスト、コントロール コントロール) +36
System.Web.UI.WebControls.SqlDataSourceView.InitializeParameters(DbCommand コマンド、ParameterCollection パラメーター、IDictionary excludeList) +257 System.Web.UI.WebControls.SqlDataSourceView.ExecuteUpdate(IDictionary キー、IDictionary 値、IDictionary oldValues) +222
System.Web. UI.DataSourceView.Update(IDictionary キー、IDictionary 値、IDictionary oldValues、DataSourceViewOperationCallback コールバック) +87
System.Web.UI.WebControls.GridView.HandleUpdate(GridViewRow 行、Int32 行インデックス、ブール値の causeValidation) +1210
System.Web.UI.WebControls .GridView.HandleEvent(EventArgs e, Boolean causeValidation, String validationGroup) +738
System.Web.UI.WebControls.GridView.OnBubbleEvent(オブジェクト ソース、EventArgs e) +89 System.Web.UI.Control.RaiseBubbleEvent(オブジェクト ソース、EventArgs 引数) +37
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(オブジェクト ソース、EventArgs e) +88 System.Web.UI.Control.RaiseBubbleEvent(オブジェクト ソース、EventArgs args) +37
System.Web.UI.WebControls.LinkBut​​ton.OnCommand(CommandEventArgs e) +121 System.Web.UI.WebControls .LinkBut​​ton.RaisePostBackEvent(String eventArgument) +156
System.Web.UI.WebControls.LinkBut​​ton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument ) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9642898 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

コードからわかるように、GridView と列の両方にプロパティ ClientIDMode="Static" を既に適用しています。Chrome を使用して Account 列の生成された ID を確認し、id=tbAccount を見つけましたが、name="ctl00$PageTitlePlaceHolder$gv_MediCareLocals$ctl02$tbAccount"

とにかく、Sql UpdateParameter が name プロパティを使用するとは思わない。

4

1 に答える 1