Gespeicherte Prozedur gibt mehrere Record
-
05-07-2019 - |
Frage
Ich bin ziemlich neu in c #. Ich habe eine Seite, die mehr Cord-Sets und ein einzelnes sproc erfordert, die sie zurückgibt. Ich bin mit einem Repeater-Steuerelement für den Haupt-Cord. Wie komme ich zum nächsten zurück-Cord bekommen?
OK, so ist die Datenquelle in der aspx-Seite. Ich würde es auf den Code hinter Seite haben zu bewegen Nextresult Recht zu benutzen? Hier ist nun mein Code. Wie kann ich die Datenquelle auf den Code-Behind bewegen, implementieren einen Datareader, so kann ich Nextresult benutzen?
<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"> </td>
</tr>
<tr>
<td><%#Container.DataItem(0)%></td>
<td><%#Container.DataItem(1)%></td>
<td><%#Container.DataItem(2)%></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
Lösung
Rufen Sie die Nextresult () -Methode für Ihre Leser zum nächsten Ergebnis zu gelangen.
Nein, Sie können dies mit SqlDataSource nicht tun, müssen Sie Code-Behind verwenden oder das Verfahren in einzelne Abfragen zu brechen.
Andere Tipps
Vielen Dank für Ihre Antworten jedermanns Sache. Nextresult () funktioniert gut, sofern Sie schon einige Änderungen aus der Drag & Drop-Steuerung Schöpfung gehen zu machen. Hier sind sie.
- Entfernen Sie die Datenquelle aus der aspx Seite
- Entfernen Sie die DataSourceID Eigenschaft aus dem Repeater-Steuerelement
- Erstellen Sie eine Funktion in Ihrem Code-Behind, die ein Datareader-Objekt zurückgibt. zB AstMgtDr ()
-
Auf Ihrer Seite lädt die Datenquelle und databind Eigenschaften für das Repeater-Steuerelement gesetzt
Repeater1.DataSource = AstMgtDr();
Repeater1.DataBind();
-
An der Spitze Ihrer aspx Seite, eine Seite Ebene Richtlinie fügen Sie den „System.Data.Common“ zu verwenden, Namespace
<%@ Import namespace="System.Data.Common" %>
-
Ihre Daten anzuzeigen:
Dies ist die Methode, mit der besten Leistung, aber es bedarf der ausdrücklichen Typisierung
`<%#((DbDataRecord)Container.DataItem).GetInt32(0)%>`
Dies ist eine weitere Methode Feld mit Namen - teurer als die vorherige Methode, aber schneller als die Standard-Eval.
`<%# ((DbDataRecord)Container.DataItem)["ShipmentID"] %>`
Hope spart jemand anderes etwas Zeit.
Diese Frage wurde ein paar Mal gesehen und ich wollte nur meine eigene Lösung unterbreiten.
weiß, dass ich die ursprüngliche Frage war c #, aber ich unterstütze Legacy-Systeme und es ist einfach, den Code zu konvertieren.
Das kam heute für mich. Ich brauchte eine schnelle und schmutzige Art und Weise die Ergebnisse aus einer gespeicherten Prozedur anzuzeigen, die 7 verschiedene Datensätze zurückgegeben.
Ich ging über diesen durch eine System.Data.DataSet mit meinen gespeicherten Prozedur Ergebnissen zu füllen. Dann Datagrids dynamisch erstellen, und das Hinzufügen von ihnen einen Platzhalter.
HTML-Code:
<html>
<body>
<form id="form1" runat="server">
<asp:PlaceHolder ID="phMetrics" runat="server"/>
</form>
</body>
</html>
VB.NET-Code:
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