2008-11-10 8 views
3

J'ai un grand ensemble de données (plus de 100 000 enregistrements) que je souhaite charger dans un DataGridView. La procédure stockée qui effectue cela peut prendre 10 secondes ou plus pour terminer. Jusqu'à présent, j'ai un BackgroundWorker empêchant l'IU de se bloquer, et j'ai implémenté une boîte de dialogue rudimentaire "Please Wait".Arrière-plan remplissant un DataGridView à partir d'un SqlDataAdapter

Ce que je voudrais faire est en quelque sorte de remplir le DataGridView avec des résultats comme ils sont renvoyés de la base de données en quelque sorte. La meilleure façon de le décrire est de savoir comment SQL Server Management Studio le fait: lorsqu'une requête est exécutée, les lignes reviennent immédiatement même si la requête est toujours en cours d'exécution. Il y a aussi un bouton pour arrêter la requête et garder les lignes qui ont été retournées.

Comment puis-je faire cela dans mon propre code? DataGridView est uniquement utilisé pour afficher les lignes de données, puis l'utilisateur clique sur un pour faire autre chose.

Rien n'est écrit dans la base de données.

Répondre

4

100 000 lignes dans un datagridview? Dis juste non"!

  1. l'utilisateur ne peut pas voir 100.000 lignes à la fois
  2. le trafic réseau pour transmettre 100.000 lignes est non négligeable
  3. la surcharge de mémoire pour 100.000 lignes DataGridView est non négligeable
  4. l'utilisateur n'a qu'à sélectionner une ligne et continuer
  5. si cette application est toujours utilisé par plus d'un utilisateur à la fois, le DBA vous traquer

suivre les conseils de austin, et afficher uniquement une page à un moment

+0

5. m'a fait rire :)) –

0

Je doute que vous puissiez le faire dans un DataGridView de la même manière que Management Studio. Je dirais que vous obtenez toutes les lignes de votre application à la fois lorsque l'appel de procédure stockée se termine.

4

Il semble que la meilleure option serait d'utiliser un mécanisme de pagination, de sorte que vous ne montriez à l'utilisateur qu'une quantité donnée de données à la fois. Cela accélérerait l'extraction des données et le chargement de la page. Vous pouvez utiliser la pagination intégrée de GridView (je recommande d'utiliser le cache .NET avec cette approche, car il extrait l'ensemble de données à chaque fois, même s'il n'affiche qu'une page d'enregistrements). Vous pouvez également implémenter la pagination avec LINQ to SQL où vous ne prenez qu'une page à la fois. Voici un lien vers un bon article que j'ai trouvé récemment qui explique comment faire cela.

http://www.dbtutorials.com/display/linq-to-sql-paging-cs.aspx

0

Vous pouvez également regarder dans quelques ajustements de back-end, aussi bien. L'ajout d'un index dans un tel cas nous a aidé à plusieurs reprises. Essayez d'exécuter la procédure stockée à partir de SQL Server Management Studio avec l'option «Plan d'exécution» activée. Recherchez les endroits où la procédure stockée peut s'embuer (c'est-à-dire des pourcentages d'exécution élevés). Lorsque vous survolez les éléments, une liste de détails d'exécution apparaît. Au bas de la liste, regardez si des champs sont comparés. Ce sont des cadeaux mortels pour l'indexation des candidats.

2

Comme suggéré par d'autres, affichant 100K enregistrements dans une grille sonne comme une mauvaise idée, mais si vous avez vraiment ...

Vous êtes sur la bonne voie avec votre fil d'arrière-plan, mais vous devrez utiliser un lecteur de données et lire les lignes de façon séquentielle à mesure qu'elles sont retournées.Votre thread de travail d'arrière-plan doit alors rassembler une addition de lignes de grille dans le thread d'interface utilisateur pour chaque ligne lue dans le lecteur de données. Sachez que tout avantage lié à l'utilisation d'une unité d'exécution distincte pour répondre à l'IU sera annulé, car elle sera constamment occupée à ajouter des lignes de toute façon. Je vous propose de mettre en place une sorte d'approche par lots, et de faire en sorte que l'interface utilisateur ajoute de nouvelles lignes seulement une fois par seconde environ. Vous voudrez faire très attention ici, et garder à l'esprit une possible condition de course. Une situation peut survenir lorsque votre arrière-plan ajoute des lignes du gestionnaire de données à une sorte de collection, et votre interface utilisateur peut vouloir lire la collection en même temps - cela entraînera certainement des problèmes.

Questions connexes