2009-06-16 7 views
1

Je suis assez nouveau à C#. J'ai une page qui nécessite plusieurs jeux d'enregistrements, et un seul sproc qui les renvoie. J'utilise un contrôle de répéteur pour le jeu d'enregistrements principal. Comment accéder au jeu d'enregistrements renvoyé suivant? OK, donc la source de données est dans la page ASPX. Je l'aurais déplacé vers le code derrière la page pour utiliser NextResult non? Voici mon code maintenant. Comment déplacer la source de données vers le codebehind, implémenter un lecteur de données pour pouvoir utiliser nextresult? Appelez la méthode NextResult() sur votre lecteur pour passer au résultat suivant.Procédure stockée renvoie plusieurs jeux d'enregistrements

<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> 

Répondre

9

Non, vous ne pouvez pas le faire en utilisant SqlDataSource, vous devez utiliser codebehind ou briser la procédure dans des requêtes distinctes.

+0

m'a battu par secondes. – AllenG

+0

Lol. J'ai même dû le chercher parce que cela faisait si longtemps que j'avais touché un DataReader en chair et en os. –

+0

Merci de m'indiquer dans la bonne direction. J'espère que vous pourrez élaborer un peu plus en raison de mon inexpérience. – Praesagus

2

Merci pour vos réponses tout le monde. NextResult() fonctionne bien à condition de faire quelques changements à partir de la création du contrôle glisser-déposer. Les voici.

  1. Retirez la source de données de la page ASPX
  2. Retirez la propriété DataSourceID du contrôle Repeater
  3. Créer une fonction dans votre codebehind qui retourne un objet datareader. par exemple AstMgtDr()
  4. Sur votre chargement de la page définir la source de données et les propriétés DataBind pour le contrôle Repeater

    Repeater1.DataSource = AstMgtDr();

    Repeater1.DataBind();

  5. En haut de votre page ASPX, ajoutez une directive de niveau page d'utiliser le "System.Data.Common" espace de noms <%@ Import namespace="System.Data.Common" %>

  6. pour afficher y nos données:

c'est la méthode la meilleure performance mais il exige explicitement dactylographie

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

ceci est une autre méthode utilisant champ noms - plus cher que la méthode précédente mais plus rapide que l'évaluation par défaut.

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

Hope this sauve quelqu'un d'autre un certain temps.

0

Cette question a été vue plusieurs fois et je voulais simplement soumettre ma propre solution.
Je sais que la question initiale était C#, mais je suis en charge les systèmes hérités et il est facile de convertir le code.

Cela m'est venu aujourd'hui. J'avais besoin d'un moyen rapide et méchant d'afficher les résultats d'une procédure stockée qui renvoyait 7 jeux de données différents.

Je suis allé à ce sujet en remplissant un System.Data.DataSet avec mes résultats de procédure stockée. Ensuite, créez dynamiquement DataGrids et ajoutez-les à un PlaceHolder.

Code HTML:

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

Code 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 
Questions connexes