如何在SqlDataSource中参数化Update查询

时间:2013-04-09 05:09:15

标签: c# asp.net

enter image description here

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

我想使用SqlDataSource来执行更新,选择和插入功能。 我真的不想自己编写后端代码。 (我实际上已经编写了所有代码,但是旧的代码太乱了,无法测试,也没有注释,所以它让我很难检测到bug在哪里,所以我放弃了后端代码并使用了SqlDataSource) / p>

相反,我想将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“帐户”中找到控件'tbAccount'。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.InvalidOperationException:找不到   在ControlParameter'Account'中控制'tbAccount'。

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[InvalidOperationException:找不到控件'tbAccount'   ControlParameter'Account'。]   System.Web.UI.WebControls.ControlParameter.Evaluate(HttpContext的   上下文,控制控制)+2155166
  System.Web.UI.WebControls.Parameter.UpdateValue(HttpContext context,   控制控制)+50
  System.Web.UI.WebControls.ParameterCollection.UpdateValues(HttpContext的   上下文,控制控制)+101
  System.Web.UI.WebControls.ParameterCollection.GetValues(HttpContext的   上下文,控制控制)+36
  System.Web.UI.WebControls.SqlDataSourceView.InitializeParameters(的DbCommand   command,ParameterCollection参数,IDictionary exclusionList)   +257 System.Web.UI.WebControls.SqlDataSourceView.ExecuteUpdate(IDictionary   keys,IDictionary values,IDictionary oldValues)+222
  System.Web.UI.DataSourceView.Update(IDictionary keys,IDictionary   values,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   来源,EventArgs args)+37
  System.Web.UI.WebControls.GridViewRow.OnBubbleEvent(Object source,   EventArgs e)+88 System.Web.UI.Control.RaiseBubbleEvent(Object   来源,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(字符串   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查看“帐户”列生成的ID并找到了id = tbAccount,但名称=“ctl00 $ PageTitlePlaceHolder $ gv_MediCareLocals $ ctl02 $ tbAccount”

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

1 个答案:

答案 0 :(得分:0)

如果您创建存储过程,那么它将很容易。为此,请访问此Link

希望它有效。