2009-06-16 4 views
1

Я довольно новичок в 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> 

ответ

9

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

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

+0

бил меня по секундам. – AllenG

+0

Lol. Мне даже пришлось искать его, потому что так давно я коснулся DataReader во плоти. –

+0

Спасибо, что указал мне в правильном направлении. Я надеюсь, что вы сможете немного подробнее объяснить мою неопытность. – Praesagus

2

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

  1. Удалить источник данных из ASPX страницы
  2. Удалить свойство DataSourceID из элемента управления Repeater
  3. Создать функцию в вашем коде, который возвращает объект DataReader. например AstMgtDr()
  4. На вашей странице загрузки установите источник данных и DataBind свойства для элемента управления 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

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