2009-08-04 7 views
2

Salut J'ai une table avec 100000 lignes de données. Maintenant, je veux présenter mes données sous forme d'utilisateur avec la taille de la page 50.Pagination dans asp.net

Quelle est la meilleure approche pour le présenter. Dois-je preffer datalist? ou puis-je implémenter ma propre requête select pour obtenir 50 enregistrements chaque fois que j'appuie sur le bouton suivant?

Merci à l'avance

+0

Quelle base de données utilisez-vous? –

Répondre

1

Pour 100000, il sera beaucoup de temps pour obtenir tous les enregistrements de la base de données dans l'ensemble de données et la page les. Au lieu de cela, j'irais avec l'implémentation de la pagination dans la base de données stockée procédure/requête. De cette façon, seulement 50 enregistrements seraient récupérés dans le code frontal à la fois et la réponse de l'utilisateur serait plus rapide.

+0

merci pour votre réponse rapide. Mais ici, le problème est d'obtenir les 50 enregistrements suivants de la campagne actuelle. Comment puis-je obtenir ces dossiers. Pouvez-vous me donner une simple requête pour le faire – Nagu

+0

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

+0

Vous pouvez le faire facilement avec LINQ to SQL - http: // www .dbtutorials.com/display/linq-à-sql-paging-cs.aspx – RichardOD

0

Que dire de "ListView" et "DataPager"?

+0

ya nous pouvons l'utiliser mais la chose est le problème de performance. Que se passera-t-il si 1000 utilisateurs accèdent à ma page en même temps? Comment il maintient les choses en interne. Va-t-il récupérer les 100000 lignes entières à la fois ou par page? C'est ce que je pense – Nagu

+0

que font les utilisateurs avec autant de résultats? ont-ils vraiment besoin et veulent regarder manuellement plus de 100000rows? – nWorx

0

Je voudrais utiliser un pagedDataSource puis vous pouvez lier à un répéteur, datalist ou autre.

il y a et l'exemple here.

4

Vous pouvez le faire assez facilement avec un GridView si vous allumez AllowPaging et réglez le PageSize à 50. Mais il sera horriblement inefficace - chaque fois que vous passez à une nouvelle page, il va lire tous 1 000 000 lignes, déterminez les 50 qu'il doit afficher et jetez le reste. Ce que vous voulez à la place est un proc stocké dans votre base de données qui prend le numéro de page que vous voulez afficher, élabore l'ensemble des lignes sur cette page et les renvoie à la page ASP.NET. Si vous utilisez SQL Server 2005 ou plus tard, le mieux est d'utiliser une expression de table commune, de sorte que votre proc stocké ressemblera à quelque chose comme ça (ce qui est pour le db Northwind):

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 

Maintenant, retour à ta page. Vous aurez besoin de mettre dans un DataGrid - ils ont un meilleur support pour la pagination personnalisée que toute autre chose - et définir AllowCustomPaging à True. Vous pourriez trouver plus facile d'avoir une méthode qui appelle votre proc stocké avec le numéro de page, puis vous pouvez ajouter Précédent, Suivant, Premier, Dernier, +10, -10 boutons - ce que vous voulez, il suffit de travailler sur le numéro de page et passer à la méthode.

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 pour l'utilisation de row_number() –