12
votes

Pagage de données dans SQL Server CE (Edition Compact)

J'écris une application WPF DESTOP et j'aimerais utiliser SQL Server CE comme un backend. J'essaie de trouver un bon moyen de faire une pagination de données efficace. Dans SQL Server Express, je peux faire quelque chose comme ceci: xxx

existe quelque chose de comparable dans SQL Server CE? Je ne suis pas complètement sûr de ce qui est et n'est pas pris en charge. Je veux seulement retourner 10 lignes à la fois de la base de données et ne pas avoir à retirer toutes les données, puis à le filtrer pour afficher à l'utilisateur, car cela est beaucoup plus lent. Merci.


1 commentaires

Neil, vois mon commentaire sur ma réponse.


5 Réponses :


2
votes

Honnêtement, probablement la chose la plus rapide à faire est d'utiliser un SQLCEDAREADER et appelez .Read () 10 fois. Ensuite, lorsque l'utilisateur passe à la page suivante, vous indiquez déjà au 11ème résultat et que vous pouvez lire 10 de plus. Si vous devez revenir en arrière, vous pouvez soit cacher vos résultats ou passer à un SQLCERESULTset qui prend en charge cherche .

En outre, SQLCEDatreader / Résultat est, de l'expérience, le moyen absolu le plus rapide d'interagir avec la base de données sur le bureau. Il peut être littéralement 100 fois plus rapide que d'utiliser des jeux de données / des datadapters.


2 commentaires

Est-ce que le SQLCERESULTSULTSUTSULTSUT replacez-en tout dans le résultat défini de la base de données à la fois (comme une carte de données déconnectée) ou d'ouvrir simplement la connexion à la base de données et de lire les lignes comme elles sont demandées? Si cela laisse une connexion à la base de données ouverte, peut-être que je peux utiliser une combinaison de la méthode SQLCERESULTset et la méthode Readabsolute pour passer aux enregistrements dont j'ai besoin, les lire dans une liste, puis renvoyer la liste et fermer la connexion.


@Neil, ResultatsT / Datareader Besoin d'une connexion persistante. Ils sont à peu près un curseur SQL, à toutes fins utiles. Ce qui est particulièrement agréable, c'est que vous pouvez également ouvrir la table entière en tant que tabilite, lui donner un index et rechercher cet index et c'est SO FAST.



5
votes

Je travaille actuellement sur une application WPF qui utilise SQL Server CE comme mécanisme de persistance. Nous avons plusieurs tables (40+) et certaines d'entre elles sont assez grandes (50k enregistrements, au moins grandes pour mes normes).

Mes conseils sur la pagination de données directement dans SQL CE sont ceci: Évitez-le si vous le pouvez! J'ai utilisé l'approche décrite par Bob King et au moins pour moi, cela a entraîné un code très laid, un véritable cauchemar d'entretien.

sauf si vous aurez besoin de page sur des dizaines de milliers d'enregistrements, je pense que la meilleure approche consiste à les charger tous en utilisant SQLCEDAREADER dans une collection de classes personnalisées, puis page sur la collection en mémoire. J'ai trouvé cette approche pour être plus réactive que de ré-exécuter la requête SQL à chaque fois, même avec la mise en cache. Ce qui s'est passé est que, dans mon cas, les questions étaient assez complexes et la performance SQLCEDatreader était suffisamment bonne de manière à ce que la performance ait été presque imperceptible. Pas besoin de pointer que, après la première charge de lots, chaque changement de page se produit presque instantanément parce que tout est maintenu en mémoire.

L'opinion générale de mes utilisateurs était que c'est correct d'attendre un peu plus longtemps pour que les premiers résultats apparaissent, si cela va conduire à une pagaie plus rapide après. Et en utilisant LINQ, la pagination est aussi simple que d'appeler Skip et de prendre des méthodes. J'ai mis en œuvre cette logique à l'intérieur d'une classe de pager, ce qui la rend très sèche et agréable.


0 commentaires

1
votes

Il y a quelques façons, mais la manière la plus simpliste serait comme suit:

supposant p>

  1. Taille de la page = 10 LI>
  2. page = 2 li> ol>

    alors p>

    1. premier top = Pagesize (10) Li>
    2. Deuxième TOP = Pagesize * Page (20) LI> OL>
      SELECT
       [Page].[ID],
       [Page].[FirstName],
       [Page].[LastName]
      FROM
      (
      SELECT TOP (10)
       [FirstRows].[ID],
       [FirstRows].[FirstName],
       [FirstRows].[LastName]
      FROM
       (
       SELECT TOP (20)
        [TestTable].[ID],
        [TestTable].[FirstName],
        [TestTable].[LastName]
       FROM
        [TestTable]
       ORDER BY
        [TestTable].[ID] ASC
       ) AS [FirstRows]
      ORDER BY 
       [FirstRows].[ID] DESC
      ) AS [Page]
      ORDER BY
        [Page].[ID] ASC


0 commentaires


1
votes

J'ai mis en œuvre la pagination personnalisée pour DataGrid à l'aide de SQL CE. J'ai mis en œuvre la méthode d'utilisation du sommet dans Sélectionner une instruction et de sauter des enregistrements à l'aide de sous-requête comme indiqué dans la réponse ci-dessus. Mais cela fonctionne bien avec une petite quantité de données. Comme les enregistrements se développent en milliers de la méthodologie ci-dessus devient moins utile et devient lentement dans la performance.

J'ai résolu une mauvaise question de performance en utilisant ma propre technique. Ce que j'ai fait est que je stocke ID de premier et dernier enregistrement sur chaque page dans les variables. xxx

et xxx

i Initialise ces variables après la grille est liée à chaque page.

Si l'utilisateur cliquez sur le bouton Suivant, je récupère les enregistrements supérieurs (pagsize) de la base de données supérieure à Lastrecord Si l'utilisateur clique sur le bouton précédent, je récupère les enregistrements supérieurs (Pagesize) à partir de la base de données inférieure à FirStrecord. Aussi je commande par id descendre dans ce cas. Et réorganiser le jeu de données à l'aide de DataView à ASC avant de se lier à DataGrid.

Cela a fait ma pagination la plus efficace. Bien que je devais mettre des efforts supplémentaires pour insérer et supprimer des cas d'enregistrements. Mais j'ai pu gérer cela.


0 commentaires