Question

Je souhaite charger un jeu de données volumineux (plus de 100 000 enregistrements) dans un DataGridView. La procédure stockée qui effectue cette opération peut prendre 10 secondes ou plus.

Jusqu'à présent, j'ai un BackgroundWorker qui empêche le verrouillage de l'interface utilisateur et j'ai mis en place un dialogue rudimentaire "Veuillez patienter".

Ce que j'aimerais faire, c'est remplir d'une manière ou d'une autre le DataGridView avec les résultats au fur et à mesure qu'ils sont renvoyés de la base de données. La meilleure façon de le décrire est la façon dont SQL Server Management Studio le fait: lorsqu'une requête est exécutée, les lignes sont renvoyées immédiatement même si la requête est toujours en cours d'exécution. Il existe également un bouton permettant d’arrêter la requête et de conserver les lignes renvoyées.

Comment puis-je faire cela dans mon propre code?

Le DataGridView n’est utilisé que pour afficher les lignes de données, puis l’utilisateur clique sur l’une pour faire autre chose. Rien n'est écrit dans la base de données.

Était-ce utile?

La solution

100 000 lignes dans une datagridview? il suffit de dire "non"!

  1. l'utilisateur ne peut pas voir 100 000 lignes à la fois
  2. le trafic réseau pour transmettre 100 000 lignes n'est pas négligeable
  3. la surcharge de mémoire pour 100 000 lignes datagridview n'est pas négligeable
  4. l'utilisateur n'a besoin que de sélectionner une ligne et de continuer
  5. si cette application est utilisée par plusieurs utilisateurs à la fois, l'administrateur de base de données vous poursuivra

suivez les conseils de austin et affichez une page à la fois

Autres conseils

Il semble que la meilleure option serait d’utiliser une sorte de mécanisme de pagination afin que vous ne montriez à l’utilisateur que la quantité de données définie à 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 vous recommanderais d'utiliser le cache .NET avec cette approche car il extrait l'ensemble du jeu 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 dans laquelle vous ne saisissez qu'une page à la fois. Vous trouverez ci-dessous un lien vers un bon article que j'ai trouvé récemment et qui explique comment faire cela.

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

Comme l'ont suggéré d'autres personnes, afficher 100 000 enregistrements dans une grille semble une mauvaise idée, mais si vous devez vraiment ...

Vous êtes sur la bonne voie avec votre thread d'arrière-plan, mais vous devrez utiliser un lecteur de données et lire les lignes de manière séquentielle à mesure qu'elles sont renvoyées. Votre thread de travail d’arrière-plan devra alors organiser un ajout de ligne de grille au thread d’interface utilisateur pour chaque ligne lue dans le lecteur de données.

Sachez que tout avantage lié à l'utilisation d'un thread distinct pour que l'interface utilisateur reste réactive sera annulé car il sera occupé à ajouter constamment des lignes de toute façon. Je vous propose de mettre en œuvre une sorte d’approche de traitement par lots, et que l’interface utilisateur n’ajoute de nouvelles lignes qu’une fois par seconde environ. Vous voudrez être très prudent ici et garder à l’esprit une possible condition de course. Il peut arriver que votre arrière-plan ajoute des lignes du datareader à une sorte de collection et que votre interface utilisateur veuille lire la collection en même temps, ce qui entraînera presque certainement des problèmes.

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 en même temps lorsque l'appel de procédure stockée est terminé.

Vous pouvez également examiner certains réglages d’arrière-plan. L'ajout d'un index dans un tel cas nous a beaucoup aidé. Essayez d’exécuter la procédure stockée à partir de SQL Server Management Studio avec le "Plan d’exécution". option activée. Recherchez les endroits où la procédure stockée risque de s'enliser (c'est-à-dire des pourcentages d'exécution élevés). Lorsque vous survolez les éléments, une liste des détails d’exécution s’affiche. Au bas de la liste, vérifiez si des champs sont comparés. Ce sont des cadeaux morts pour l'indexation des candidats.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top