存储过程返回多个记录集

时间:2009-06-16 17:07:56

标签: c# web-applications multiple-resultsets

我对c#很新。 我有一个需要多个记录集的页面,以及一个返回它们的sproc。我正在使用主记录集的转发器控件。如何进入下一个返回的记录集?


好的,所以数据源在aspx页面中。我会把它移到页面后面的代码中使用NextResult吗?这是我现在的代码。如何将数据源移动到代码隐藏,实现datareader以便我可以使用nextresult?

<asp:SqlDataSource ID="AssetMgtSearch" runat="server" 
                ConnectionString="<%$ ConnectionStrings:OperationConnectionString %>" 
                SelectCommand="spAssetMgtItemList" SelectCommandType="StoredProcedure">
            </asp:SqlDataSource>
            <div class="contentListFullHeight">
                <table cellspacing="0" cellpadding="0" border="0" class="contentList">
                    <tr>
                        <th>ShipmentID/</td>
                        <th>MaterialID/</td>
                        <th>ItemID/</td>
                    </tr>
                    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="AssetMgtSearch">
                        <ItemTemplate> 
                            <tr>
                                <td colspan="3" style="border-top:solid thin blue">&nbsp;</td>
                            </tr>
                            <tr>
                                <td><%#Container.DataItem(0)%></td>
                                <td><%#Container.DataItem(1)%></td>
                                <td><%#Container.DataItem(2)%></td>
                            </tr>
                        </ItemTemplate>                           
                    </asp:Repeater>
                </table>

3 个答案:

答案 0 :(得分:9)

调用阅读器上的NextResult()方法以转到下一个结果。

不,您不能使用SqlDataSource执行此操作,您需要使用代码隐藏或将过程分解为单独的查询。

答案 1 :(得分:2)

感谢大家的回答。如果你从拖放控件创建中做了很多改动,NextResult()运行良好。他们在这里。

  1. 从aspx页面中删除数据源
  2. 从Repeater控件中删除DataSourceID属性
  3. 在代码隐藏中创建一个返回datareader对象的函数。例如AstMgtDr()
  4. 在页面上加载设置Repeater控件的数据源和数据绑定属性

    Repeater1.DataSource = AstMgtDr();

    Repeater1.DataBind();

  5. 在aspx页面的顶部,添加一个页面级指令以使用“System.Data.Common” 命名空间  <%@ Import namespace="System.Data.Common" %>

  6. 要显示您的数据:

  7.   

    这是最好的方法   性能,但它需要明确   打字

    `<%#((DbDataRecord)Container.DataItem).GetInt32(0)%>`
    
      

    这是使用字段的另一种方法   名字 - 比...更贵   以前的方法,但比默认的Eval快。

    `<%# ((DbDataRecord)Container.DataItem)["ShipmentID"] %>`
    

    希望这能节省一些时间。

答案 2 :(得分:0)

这个问题已被多次查看,我只想提交自己的解决方案。
我知道最初的问题是c#,但我支持遗留系统,并且很容易转换代码。

今天就出现了。我需要一种快速而肮脏的方式来显示返回7个不同数据集的存储过程的结果。

我通过使用我的存储过程结果填充System.Data.DataSet来解决这个问题。然后动态创建DataGrids,并将它们添加到PlaceHolder。

HTML代码:

<html>
  <body>
  <form id="form1" runat="server">
    <asp:PlaceHolder ID="phMetrics" runat="server"/>
  </form>
  </body>
</html>

VB.NET代码:

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    Dim ds As System.Data.DataSet = Me.GetMetrics()
    If ds IsNot Nothing Then
        For i As Integer = 0 To ds.Tables.Count - 1
            Dim _rpt As New System.Web.UI.WebControls.DataGrid()
            With _rpt
                .AutoGenerateColumns = True
                .Attributes.Add("name", "table_" & i + 1)
                .DataSource = ds.Tables(i)
                .DataBind()
            End With
            Me.phMetrics.Controls.Add(_rpt)
        Next
    End If
End Sub

Private Function GetMetrics() As System.Data.DataSet
    Dim dsMetrics As New System.Data.DataSet

    Using _sqlConn As New System.Data.SqlClient.SqlConnection(_sqlConnString)
        _sqlConn.Open()
        Dim _SqlCommand As New System.Data.SqlClient.SqlCommand("[dbo].[My_Stored_Procedure]", _sqlConn)
        With _SqlCommand
            .CommandType = System.Data.CommandType.StoredProcedure
            .Parameters.Add(New System.Data.SqlClient.SqlParameter("@ClientID", 101))
        End With
        Dim _sqlAdapter As New System.Data.SqlClient.SqlDataAdapter(_SqlCommand)
        With _sqlAdapter
            .Fill(dsMetrics)
            .Dispose()
        End With
        _sqlConn.Close()
        _sqlConn.Dispose()
    End Using

    Return dsMetrics
End Function