0

在此处输入图像描述

我正在维护一个旧网站,代码非常混乱。

我想使用 SqlDataSource 来执行更新、选择、插入功能。我真的不想自己写后端代码。(其实我已经把所有的代码都写好了,但是旧代码太乱了,无法测试,也没有注释,让我很难检测到bug在哪里,所以我放弃了后端代码,正在使用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(不像帐户和密码)。那么如何编写 where 子句以便在当前行中找到 DivisionID 呢?

更新: 我已将 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 context, Control control) +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 row,Int32 rowIndex,Boolean CauseValidation)+1210
System.Web.UI.WebControls .GridView.HandleEvent(EventArgs e, Boolean CauseValidation, String validationGroup) +738
System.Web.UI.WebControls.GridView.OnBubbleEvent(Object source, EventArgs e) +89 System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(对象源,EventArgs e) +88 System.Web.UI.Control.RaiseBubbleEvent(Object source, 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(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)+1724

从代码中可以看出,我已经在 GridView 和列上应用了属性 ClientIDMode="Static"。我使用 Chrome 查看为 Account 列生成的 id,发现 id=tbAccount,但 name="ctl00$PageTitlePlaceHolder$gv_MediCareLocals$ctl02$tbAccount"

我认为 Sql UpdateParameter 无论如何都不会使用 name 属性。

4

1 回答 1

0

如果你创建一个存储过程,那么它会很容易。为此,请访问此链接

希望它有效。

于 2013-04-09T07:17:35.493 回答