VB.NET: 如何根据存储过程结果调用另一个存储过程并显示所有结果?

VB.NET: How to call another stored procedures based on stored procedure result and display all results?

我有一个场景,我的存储过程 (sp1) 从网页获取输入并 returns 一些结果。例如,如果 sp1 returns 10 条记录,我们在每条记录中都有 "id" 列,我们需要将那个 "id" 列值传递给另外两个存储过程(例如:sp2,sp3)并在页面开头显示与 record1 关联的所有结果(来自 sp1、sp2、sp3),然后显示与 record2 相关的所有详细信息,依此类推。

网页上的输出应如下所示:

Record1 details 

Sp2 Output(record1)

sp3 Output(record1)

Record2 details 

Sp2 Output(record2)

sp3 Output(record2)
Record3 details 

Sp2 Output(record3)

sp3 Output(record3)

............

谁能告诉我如何以这种方式呈现。 Sp1 结果在一个数组列表中(在代码后面),sp2 和 sp3 字面意思是 return 表(大约 10 个记录,有 5-6 列)。

我只需要如何显示数据.. 我正在使用 for each 为 sp1 结果中的每条记录执行 sp2 和 sp3。想知道如何在代码后面存储数据以及如何在 aspx.page..

上显示

这将是使用 Repeater Class 的理想选择。您可以嵌套它们以处理基于初始数据源显示数据的逻辑。由于我不知道您的模型定义,因此我使用了您需要在示例代码中替换的通用占位符。这些占位符的示例包括 "SomeFieldFromSp2DataTable"、"FieldNameOfId"、"TheClassOfItemsInYourArrayList" 等

首先,在 ASPX 页面中制作标记。 HeaderTemplate 包含用于数据源的 header 的标记。 ItemTemplate 是数据源中每个项目的 body 的标记。 FooterTemplate 在数据源的末尾做标记。在这个例子中,我模拟了它,所以它会创建嵌套的 HTML 表。

<asp:Repeater ID="rptSP1" runat="server">
    <HeaderTemplate>    
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td><asp:Label ID="lblSP1" runat="server"><%# CType(Container.DataItem, TheClassOfItemsInYourArrayList).FieldNameOfId%></asp:Label></td>
        </tr>
        <asp:Repeater ID="rptSP2" runat="server">
            <HeaderTemplate>
                <tr><td><table>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td><asp:Label ID="lblSP2" runat="server"><%#DataBinder.Eval(Container.DataItem, "SomeFieldFromSp2DataTable")%></asp:Label></td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table></td></tr>
            </FooterTemplate>
        </asp:Repeater>
        <asp:Repeater ID="rptSP3" runat="server">
            <HeaderTemplate>
                <tr><td><table>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td><asp:Label ID="lblSP3" runat="server"><%#DataBinder.Eval(Container.DataItem, "SomeFieldFromSp3DataTable")%></asp:Label></td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table></td></tr>
            </FooterTemplate>
        </asp:Repeater>         
    </ItemTemplate>
    </FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

请注意,访问 ArrayList 值与 DataTable 或更典型的 List(of T) 略有不同。

接下来,您需要为您的 parent 中继器连接初始数据源绑定:

rptSP1.DataSource = YourArrayList
rptSP1.DataBind()

你还没有完成。您现在必须确保从第一个中继器获取数据,以便为第二个和第三个中继器获取数据源。您在 rptSP1 的 ItemDataBound 事件的事件处理程序中完成此操作。由于嵌套的 Repeater 位于 ItemTemplate 中,因此您必须使用 FindControl 并将它们转换为 Repeater。

Private Sub rptSP1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptSP1.ItemDataBound

    'Perform this check because you only need the actual data items.
    If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then

        Dim intIdFromSp1 As Integer = CType(e.Item.DataItem, TheClassOfItemsInYourArrayList).IdField

        Dim rptSP2 As Repeater = CType(e.Item.FindControl("rptSP2"), Repeater)
        Dim rptSP3 As Repeater = CType(e.Item.FindControl("rptSP3"), Repeater)

        'Code that gets the data from the other SPs would be in a Function called GetDataTableFromSP2.
        rptSP2.DataSource = GetDataTableFromSP2(intIdFromSp1)
        rptSP2.DataBind()

        rptSP3.DataSource = GetDataTableFromSP3(intIdFromSp1)
        rptSP3.DataBind()

    End If

End Sub