2009-08-04 5 views
2

Hallo Ich habe eine Tabelle mit 100000 Zeilen von Daten. Jetzt möchte ich meine Daten in Benutzerformular mit Seitengröße 50 präsentieren.Paging in asp.net

Was ist der beste Ansatz, um es zu präsentieren. Soll ich Datalist bevorzugen? oder kann ich meine eigene Auswahlabfrage implementieren, um jedes Mal 50 Datensätze zu erhalten, wenn ich die nächste Taste drücke?

Vielen Dank im Voraus

+0

Welche Datenbank verwenden Sie? –

Antwort

1

Für 100000, wird es sehr zeitaufwendig sein, alle Datensätze aus der Datenbank in den Datensatz und Seite sie dann zu erhalten. Stattdessen würde ich mit der Implementierung von Paging in der Datenbank gespeicherten Prozedur/Abfrage gehen. Auf diese Weise würden jeweils nur 50 Datensätze im Front-End-Code abgerufen und die Benutzerreaktion wäre schneller.

+0

danke für Ihre schnelle Antwort. Aber hier ist das Problem, nächste und vorherige 50 Datensätze von der aktuellen Prossition zu bekommen. Wie kann ich diese Aufzeichnungen bekommen? Können Sie mir eine einfache Abfrage, um es zu tun – Nagu

+0

http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx – Sekhat

+0

Sie können dies einfach mit LINQ to SQL-http tun: // www .dbtutorials.com/display/linq-to-sql-paging-cs.aspx – RichardOD

0

Was ist mit "ListView" und "DataPager"?

+0

ya können wir es verwenden, aber die Sache ist das Leistungsproblem. Was passiert, wenn 1000 Benutzer gleichzeitig auf meine Seite zugreifen? Wie es die Dinge intern erhält. Werden die ganzen 100000 Zeilen gleichzeitig oder seitenweise abgerufen? Das ist, was ich denke – Nagu

+0

Was machen die Benutzer mit dieser hohen Anzahl von Ergebnissen? brauchen sie wirklich und wollen manuell über 100000rows aussehen? – nWorx

0

Ich würde eine pagedDataSource verwenden, dann können Sie an einen Repeater, Datengeber oder was auch immer binden.

gibt es und Beispiel here.

4

Man könnte dies mit einem Gridview ganz einfach tun, wenn Sie auf AllowPaging wechseln und die PageSize bis 50. Aber stellte es schrecklich ineffizient sein wird - jedes Mal, wenn Sie auf eine neue Seite bewegen werde alles 1 lesen 000 000 Reihen, erarbeiten, welche 50 es anzeigen muss, und den Rest wegwerfen.

Was Sie stattdessen möchten, ist eine gespeicherte Prozedur in Ihrer Datenbank, die die anzuzeigende Seitennummer übernimmt, die Reihe der Zeilen auf dieser Seite berechnet und sie an die ASP.NET-Seite zurückgibt. Wenn Sie SQL Server 2005 oder höher verwenden Ihre beste Wette ist eine Common Table Expression zu verwenden, so wird Ihre gespeicherte Prozedur wie folgt aussehen (dies ist für die Northwind db):

CREATE PROC [dbo].[PagedOrderList] 
@PageNumber INTEGER 
AS 
SET NOCOUNT ON 

DECLARE @lowerRecordNumber INTEGER 
DECLARE @upperRecordNumber INTEGER 

-- Work out the record numbers that bound the page 
SET @lowerRecordNumber = ((@pageNumber - 1) * 50) + 1 
SET @upperRecordNumber = (@pageNumber * 50); 

-- Create a CTE with all the records numbered 
WITH OrdersCTE ([RowNumber],[OrderId],[OrderDate],[RequiredDate],[ShippedDate], 
[CompanyName],[Value]) 
AS 
(
    SELECT 
    ROW_NUMBER() OVER(ORDER BY o.[OrderId]), 
    o.OrderID, 
    o.OrderDate, 
    o.RequiredDate, 
    o.ShippedDate, 
    c.CompanyName, 
    SUM(od.Quantity * od.UnitPrice) AS [Value] 
    FROM 
    Orders o INNER JOIN [Order Details] od ON o.OrderID = od.OrderID 
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID 
    GROUP BY o.OrderID, o.OrderDate, o.RequiredDate, o.ShippedDate, c.CompanyName 
) 
-- Select the rows from the CTE that fall between the bounds we worked out 
SELECT * 
FROM OrdersCTE 
WHERE [RowNumber] BETWEEN @lowerRecordNumber AND @upperRecordNumber 

Nun zurück zu deine Seite. Sie müssen ein DataGrid einfügen - sie haben bessere Unterstützung für benutzerdefiniertes Paging als alles andere - und setzen AllowCustomPaging auf True. Sie können es einfacher finden, eine Methode zu verwenden, die Ihren gespeicherten Prozess mit der Seitennummer aufruft. Dann können Sie die Schaltflächen Zurück, Weiter, Erstes, Letztes, +10, -10 hinzufügen - was immer Sie wollen, einfach die Seitennummer ermitteln und weitergeben es zur Methode.

Private Sub loadData(ByVal pageNumber As Integer) 

    Dim orderDataTable As DataTable 
    'This uses the Microsoft Enterprise Library for data access 
    Dim DAL As Database 
    Dim cmd As DbCommand 

    DAL = DatabaseFactory.CreateDatabase("Northwind") 

    cmd = DAL.GetStoredProcCommand("PagedOrderList") 

    'Pass the page number to the stored proc 
    DAL.AddInParameter(cmd, "@pageNumber", DbType.Int32, pageNumber) 

    'Get a DataTable back with the 50 rows we want 
    orderDataTable = DAL.ExecuteDataSet(cmd).Tables(0) 

    'Bind the data to the grid 
    With OrderDataGrid 
     .DataSource = orderDataTable 
     .DataBind() 
     'Set the page number so we know where we are in the dataset 
     .CurrentPageIndex = pageNumber 
    End With 

End Sub 


Private Sub PreviousButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles PreviousButton.Click 

    If OrderDataGrid.CurrentPageIndex = 0 Then 
     'Make sure we don't try to load a negative page number 
    Else 
     'Work out the previous page number and load the data for it 
     Call loadData(OrderDataGrid.CurrentPageIndex - 1) 
    End If 

End Sub 

Private Sub NextButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles NextButton.Click 

    'Work out the nextpage number and load the data for it 
    Call loadData(OrderDataGrid.CurrentPageIndex + 1) 

End Sub 
+0

+1 für die Verwendung von row_number() –