【问题标题】:How to parameterize the Update query in SqlDataSource如何在 SqlDataSource 中参数化更新查询
【发布时间】:2013-04-09 05:09:14
【问题描述】:

我在维护一个旧网站,代码很乱。

我想使用 SqlDataSource 来执行更新、选择、插入功能。 我真的不想自己写后端代码。 (其实我已经把所有代码都写好了,但是旧代码太乱了,无法测试,而且没有cmets,所以我很难检测到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'。

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

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

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[InvalidOperationException: 找不到控件“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 rowIndex, Boolean CausesValidation) +1210
System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e,布尔值 原因验证,字符串验证组)+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 参数)+37
System.Web.UI.WebControls.LinkBut​​ton.OnCommand(CommandEventArgs e) +121 System.Web.UI.WebControls.LinkBut​​ton.RaisePostBackEvent(字符串事件参数)+156
System.Web.UI.WebControls.LinkBut​​ton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 eventArgument) +10
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,字符串 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 属性。

【问题讨论】:

  • 当您单击单行进行更新时,您需要找到存储在“" 用于单个行并使用该值并传入更新方法。
  • 获取 HyperLinkField 的值,如 "((HyperLink)gv_MediCareLocals.Rows[e.RowIndex].Cells[0].Controls[0] ).Text" 并用于更新查询。
  • @Rahul 你好,我觉得我说的不够清楚,我不想用后端代码代替,我想用 SqlDataSource 并编写参数化查询来做更新。
  • 尝试检查该链接在 vb asp.net/web-forms/tutorials/data-access/… 中的内容
  • @Rahul,您好,谢谢您的回复。该示例使用 1 个单表,但在我的情况下,我使用 3 个表。所以我不能真正执行“从表或视图中指定列”步骤,因为它不是一个表,而是 3 个表。有什么想法吗?

标签: c# asp.net


【解决方案1】:

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

希望它有效。

【讨论】:

  • 嗨拉胡尔,谢谢您的回复。现在的问题是我无法访问嵌入在 GridView 中的文本框:在 ControlParameter 'Account' 中找不到控件'tbAccount'。
  • 首先告诉我你在哪个事件中找到了你的 tbAccount 文本框,你的文本框在 EditItemTemplate 中,所以你在页面加载等时找不到它,你可能会发现这个控件何时存在意味着当你网格视图将在编辑模式下打开。您可能会在“RowDataBound”或“RowDeleting”或“RowUpdating”或“RowUpdating”网格事件中找到它。我希望你能理解......请告诉我你在哪里或在哪个事件中找到它文本框值或控件。
  • string Account= ((HtmlInputText)row.FindControl("tbAccount")).Value;通过使用这一行,您可以获得文本值。
  • 我不使用我在帖子中所说的后端代码。我使用 SqlDataSource,所以我让参数从 tbAccount 中获取值。如果你能通读我的问题,我想你会明白的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-06
  • 1970-01-01
  • 2017-03-10
相关资源
最近更新 更多