【问题标题】:Nested Repeater Puzzle: Using data returned from (outer) query, in a nested query嵌套中继器难题:在嵌套查询中使用从(外部)查询返回的数据
【发布时间】:2013-07-26 14:24:09
【问题描述】:

希望您今天在从事的任何项目上都有一个良好的开端。我今天从一个有趣的问题开始,我需要解决涉及 ASP.net 中的嵌套中继器(从 SQL 数据库中获取数据以构建与教育和福利相关的赠款数据的网页结果)。

我有一个中继器,它使用 SQL 查询根据我的 SQL 表中的特定列(类别列)拉回数据:

<asp:SqlDataSource ID="SqlDataSourceGrantCategories" runat="server" 
ConnectionString="<%$ ConnectionStrings:KenticoCMSECommerceTestingConnectionString %>" 
SelectCommand="SELECT * FROM [customtable_SampleTable] ORDER BY Category">
</asp:SqlDataSource>

现在我想要一个额外的嵌套转发器,它有另一个向它提供数据的查询,但是这个内部转发器基于第一个转发器提取的 Category 列(来自 SQL 表)的查询。这是我目前所拥有的:

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSourceGrantCategories">
  <ItemTemplate>
  <%# Eval("Category") %> //I just need this piece of data, but used below.
  <br />
      <asp:Repeater ID="Repeater2" runat="server" DataSourceID="SqlDataSourceGrantInfo">
      <asp:SqlDataSource ID="SqlDataSourceGrantInfo" runat="server" ConnectionString="<%$ ConnectionStrings:KenticoCMSECommerceTestingConnectionString %>
    SelectCommand="SELECT * FROM [customtable_SampleTable] WHERE Category = <%# Eval('Category') %>">
    <ItemTemplate>
    <%# Eval("Title") %>
    </ItemTemplate>
  </asp:Repeater>
  <br />
  </ItemTemplate>
</asp:Repeater>

所以基本上,第二个嵌套 SqlDataSource 内的 Eval 语句没有被正确评估,它给了我一个错误,上面写着“服务器标记格式不正确”。有什么方法可以让我使用或使变量等于第一个 Eval("Category") 语句,然后我可以在我的第二个 SQL 查询字符串中使用它?

抱歉,如果这令人困惑,如果需要,我很乐意进一步详细说明。

【问题讨论】:

    标签: c# asp.net sql nested


    【解决方案1】:

    这里应该修复的几件事:

    1. 错误"Server tag not well formed" 是由于ConnectionString 属性后缺少双引号引起的。
    2. 请记住,&lt;%# %&gt; 中的所有内容都必须是有效的 C# 代码,这意味着如果您使用的是字符串 - 您应该将其括在双引号中。这里引用的典型模式是AttributeName='&lt;%# Eval("Property")%&gt;'SelectCommand 值中的情况并非如此。
    3. 当您需要同时处理文字和绑定数据时,例如此处的选择查询,最好将整个表达式包含在 servlet 标记中并在其中执行必要的转换。

    总而言之,结果如下:

    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSourceGrantCategories">
        <ItemTemplate>
            <%# Eval("Category") %>
            <br />
            <asp:SqlDataSource ID="SqlDataSourceGrantInfo" runat="server" ConnectionString="<%$ ConnectionStrings:KenticoCMSECommerceTestingConnectionString %>"
                SelectCommand='<%# "SELECT * FROM [customtable_SampleTable] WHERE Category =" + Eval("Category") %>' />
            <asp:Repeater ID="Repeater2" runat="server" DataSourceID="SqlDataSourceGrantInfo">
                <ItemTemplate>
                    <%# Eval("Title") %>
                </ItemTemplate>
            </asp:Repeater>
            <br />
        </ItemTemplate>
    </asp:Repeater>
    

    最后,出于多种原因,最好使用SelectParameters 而不是将Category 值直接插入到查询中。

    【讨论】:

    • 谢谢安德烈,非常好的答案,我现在将看看并使用这段代码。我会考虑使用 SelectParameters,但我什至不知道那是什么。我猜仍然是一个 ASP 新手。再次感谢!
    • @user2390929,要查找 SelectParameters,请查看 IntelliSense 建议您作为 &lt;asp:SqlDataSource&gt; 内部标签的内容。
    • 安德烈,看起来你的代码有效。我知道这是我在这里缺少的一些简单的东西,比如在那里使用 C# 代码构建整个字符串,而不是只取单个值。那就是在行动中解决问题,好的思考和好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多