Хранимая процедура возвращает несколько наборов записей - PullRequest
1 голос
/ 16 июня 2009

Я довольно новичок в c #. У меня есть страница, которая требует нескольких наборов записей, и один sproc, который возвращает их. Я использую контроль повторителя для основного набора записей. Как мне перейти к следующему возвращенному набору записей?


ОК, поэтому источник данных находится на странице aspx. Я хотел бы переместить его в код позади страницы, чтобы использовать 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 ]

9 голосов
/ 16 июня 2009

Вызовите метод NextResult () на вашем ридере, чтобы перейти к следующему результату.

Нет, вы не можете сделать это с помощью SqlDataSource, вам нужно использовать codebehind или разбить процедуру на отдельные запросы.

2 голосов
/ 18 июня 2009

Спасибо за ваши ответы всем. NextResult () работает хорошо, если вы внесете немало изменений, начиная с создания элемента управления перетаскиванием. Вот они.

  1. Удалить источник данных со страницы aspx
  2. Удалить свойство DataSourceID из элемента управления Repeater
  3. Создайте в своем коде функцию, которая возвращает объект для чтения данных. например, 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"] %>`

Надеюсь, это спасет кого-то еще.

0 голосов
/ 05 января 2017

Этот вопрос просматривался несколько раз, и я просто хотел представить свое собственное решение.
Я знаю, что исходным вопросом был 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
...