嵌套转发器拼图:在嵌套查询中使用从(外部)查询返回的数据

时间:2013-07-26 14:24:10

标签: c# asp.net sql nested

希望您今天在开展任何项目时都有一个良好的开端。我今天开始讨论一个有趣的问题,我需要解决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查询字符串中使用它?

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

1 个答案:

答案 0 :(得分:2)

应该在这里解决一些事情:

  1. 错误"Server tag not well formed"是由于在ConnectionString属性后错过了双引号。
  2. 请记住,<%# %>内的所有内容都必须是有效的C#代码,这意味着如果您使用的是字符串,则应将其括在双引号中。这里引用的典型模式是AttributeName='<%# Eval("Property")%>'SelectCommand值不是这种情况。
  3. 当您需要使用文字和绑定数据进行操作时,就像在此处的select查询中一样,最好将整个表达式包含在servlet标记中并在其中执行必要的转换。
  4. 总而言之,结果如下:

    <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值。