2010-09-28 2 views
0

Chers, Je fais face exception system.outofmemmory lors de la liaison avec un gridview DataTable ayant plus de 400000 dossiers s'il vous plaît trouver le code ci-dessous de l'échantillon pour la mêmeSystem.OutOfMemoryException lorsque la liaison d'un gridview à un DataTable ayant plus de 400000 dossiers

GridView gv = new GridView(); 
this.EnableViewState = false; 
gv.DataSource = (DataTable)dt; 
gv.DataBind(); 

Veuillez m'aider à surmonter dans cette situation est-il une limitation de gridview pour databind?

+6

Qui veut regarder un gridview avec 400000 enregistrements? – SteveCav

+1

Même si vous avez un serveur avec une mémoire infinie, vous ne devez pas renvoyer 400 000 enregistrements à partir d'une requête. : S Pourquoi ne pas paginer sur la requête? [http://blog.sqlauthority.com/2007/04/03/sql-server-t-sql-paging-query-technique-comparison-sql-2000-vs-sql-2005/] –

Répondre

2

Une grille de données est limitée par la mémoire système disponible et vous risquez probablement de rencontrer cette erreur. En supposant un espace d'adressage de, disons, 1,5 Go, c'est environ 4 Ko par ligne de données, si vous aviez rien d'autre qui consomme de la mémoire dans votre processus. 4 Ko n'est pas déraisonnable, en supposant une douzaine de colonnes larges.

Vous essayez d'afficher trop de lignes à la fois. Je dois supposer que c'est aussi une mauvaise expérience utilisateur, en essayant de parcourir autant de lignes. Regardez plutôt paging.

1

Cela fait beaucoup de rangées! Vous devez appliquer la pagination pour que la quantité de lignes soit gérable. Si la raison pour laquelle vous affichez autant de lignes est que vous devez trouver certaines données, vous devez également implémenter une fonction de recherche.

est ici un guide de MS comment activer la pagination: http://msdn.microsoft.com/en-us/library/aa479347.aspx

+0

Cher, je ne suis pas en utilisant cette vue de la grille pour afficher l'enregistrement je l'utilise pour l'exportation des données dans Excel ayant 10 manque d'enregistrement, exemple de code.Response.ContentType = "application/vnd.ms-excel"; chaîne FileName = "PoliciesDetailsForBranch"; Response.AppendHeader ("content-disposition", "pièce jointe; filename =" + NomFichier + ".xls"); GridView gv = nouveau GridView(); this.EnableViewState = faux; gv.DataSource = (DataTable) dt; gv.DataBind() ; this.ClearControls (gv); System.Web.UI.HtmlTextWriter hw = nouveau System.Web.UI.HtmlTextWriter (Response.Output); gv.RenderControl (hw); Response.End(); –

+6

Ensuite, vous ne devriez pas utiliser DataGrid du tout. Une alternative est d'utiliser le HtmlTextWriter et d'écrire la sortie vous-même, rangée par rangée. Mais vous devriez vraiment considérer pourquoi vous faites cela. 400.000 lignes sont encore beaucoup et vous devrez probablement faire face à des délais plus tard lors de la récupération des données. Il semble que vous renvoyez toutes les données connues? Si c'est le cas, vous devriez vraiment créer une fonction d'exportation dans votre base de données SQL qui videra les données dans un fichier Excel et retournera simplement le fichier existant via votre service/page. – Merrimack

2

Comme déjà suggéré, la pagination est la façon courante de traiter de grandes quantités de documents dans les applications Web. Mais s'il est nécessaire d'afficher tous les enregistrements dans la sortie (par exemple à des fins de génération de rapports), alors il existe un moyen de le faire. Au lieu de conserver le jeu de résultats en mémoire sur le serveur, vous pouvez également diffuser les données au client. Cela peut être réalisé en utilisant un DataReader au lieu d'un DataSet et en désactivant tous les mécanismes de mise en cache.

Une méthode simple pour cela consiste à utiliser un contrôle SqlDataSource par exemple. Raccordez la source de données à une vue de grille comme d'habitude. Ensuite, modifiez le DataSourceMode sur la source de données de DataSet à DataReader. Désactivez le cache de sortie de page et vous êtes prêt à partir.

Questions connexes