簡體   English   中英

存儲過程返回多個記錄集

[英]Stored Procedure Returns Multiple Recordsets

我是 c# 的新手。我有一個頁面需要多個記錄集,以及一個返回它們的存儲過程。 我正在為主記錄集使用轉發器控件。 我如何到達下一個返回的記錄集?


好的所以數據源在 aspx 頁面中。 我會把它移到頁面后面的代碼以使用 NextResult 嗎? 這是我的代碼。 如何將數據源移動到代碼隱藏,實現數據讀取器以便我可以使用 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>

在閱讀器上調用 NextResult() 方法以移動到下一個結果。

不,您不能使用 SqlDataSource 執行此操作,您需要使用代碼隱藏或將過程分解為單獨的查詢。

謝謝大家的回答。 如果您從創建拖放控件開始進行大量更改,NextResult() 將運行良好。 他們來了。

  1. 從 aspx 頁面中刪除數據源
  2. 從 Repeater 控件中刪除 DataSourceID 屬性
  3. 在返回數據讀取器 object 的代碼隱藏中創建一個 function。例如 AstMgtDr()
  4. 在您的頁面加載上,為 Repeater 控件設置數據源和數據綁定屬性

    Repeater1.DataSource = AstMgtDr();

    Repeater1.DataBind();

  5. 在您的 aspx 頁面頂部,添加頁面級指令以使用“System.Data.Common”命名空間<%@ Import namespace="System.Data.Common" %>

  6. 要顯示您的數據:

這是性能最好的方法,但它需要顯式輸入

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

這是另一種使用字段名稱的方法 - 比以前的方法更昂貴,但比默認的 Eval 更快。

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

希望這可以節省其他人一些時間。

這個問題已經被看過很多次了,我只是想提交我自己的解決方案。
我知道最初的問題是 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM