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
我有一个场景,我的存储过程 (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