私は古いウェブサイトを維持していますが、コードはかなり面倒でした。
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.LinkButton.OnCommand(CommandEventArgs e) +121 System.Web.UI.WebControls .LinkButton.RaisePostBackEvent(String eventArgument) +156
System.Web.UI.WebControls.LinkButton.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 プロパティを使用するとは思わない。