DataReader ou DataSet lors de l'extraction de plusieurs jeux d'enregistrements dans ASP.NET
J'ai une ASP.NET la page qui a un tas de contrôles qui doivent être remplis (par exemple, des listes déroulantes).
Je voudrais faire un voyage unique à la db et de ramener plusieurs jeux d'enregistrements au lieu de faire un aller-retour pour chaque contrôle.
J'ai pu ramener de plusieurs tables dans un jeu de données, ou j'ai pu ramener un objet DataReader et utilisation".NextResult' pour mettre chaque ensemble dans un personnalisé en classe affaires.
Vais-je probablement voir un assez grand avantage en termes de performances à l'aide de DataReader approche, ou devrais-je utiliser le jeu de données approche?
Des exemples de la façon dont vous l'habitude de manipuler ce serait appréciée.
source d'informationauteur GernBlandston
Vous devez vous connecter pour publier un commentaire.
la coutume de stockage et d'échange personnalisé
"Pour GridView"
votre Base de données chaque fois que la page
appelé.
Alors je pense que le mieux est d'utiliser l'objet DataReader.
d'autre
de stockage et d'échange "Pour
GridView"
stress.
Base de données en une fois, et obtenir le
les avantages de la mise en Cache.
Alors je pense que le mieux est d'utiliser un jeu de données.
Je hop que je suis de droite.
Toujours mettre vos données en classes définies pour l'utilisation spécifique. Ne passez pas des jeux de données ou DataReaders autour de.
Si votre procédure stockée retourne plusieurs ensembles, utilisez le DataReader.NextResult à l'avance pour le prochain bloc de données. De cette façon, vous pouvez obtenir toutes vos données, chargez-la à vos objets, et fermer le lecteur dès que possible. Ce sera la méthode la plus rapide pour obtenir vos données.
De voir qu'aucune réponse n'a été marqué encore, même si il y a plently de bonnes réponses déjà, je pensais ajouter par deux bits.
J'utiliserais DataReaders, comme ils sont un peu plus rapide (si la performance est votre truc ou vous avez besoin de vous autant que vous pouvez obtenir). La plupart des projets, j'ai travaillé sur des millions d'enregistrements dans chacun des tableaux et de la performance est un sujet de préoccupation.
Certaines personnes l'ont dit, il n'est pas une bonne idée d'envoyer DataReader à travers des couches. Personnellement, je ne vois pas cela comme un problème depuis un "DbDataReader" n'est pas techniquement liés (ou ne pas être) à une base de données. C'est que vous pouvez créer une instance de DbDataReader sans la nécessité d'une base de données.
Pourquoi je le fais, c'est pour les raisons suivantes:
Fréquemment (dans une Application Web), vous générez soit en Html ou en Xml ou JSON ou une autre transformation de vos données. Alors pourquoi aller d'un DaraReader à certains POCO objet uniquement pour le transformer au format XML ou JSON et l'envoyer sur le réseau. Ce type de processus nécessite généralement de 3 transformations et une botte de charge des instanciations d'objet uniquement à jeter presque instantanément.
Dans certaines situations, c'est très bien ou ne peut pas être aidé. Ma couche de Données généralement les surfaces de deux méthodes pour chaque procédure stockée que j'ai dans le système. On revient DbDataReader et l'autre retourne un DataSet/DataTable. Les méthodes de retour d'un jeu de données/DataTable appeler la méthode retournant un DbDataReader et utilise alors soit la "Charge" de la méthode de la Table de données ou d'un adaptateur pour remplir le dataset. Parfois, vous avez besoin d'ensembles de données parce que vous avez probablement de réutiliser les données d'une certaine façon, ou vous avez besoin pour tirer une autre requête et unnless vous avez MARS n'est pas activé, vous ne pouvez pas avoir un DbDataReader ouvrir et de feu, une autre requête.
Maintenant, il y a quelques problèmes avec l'utilisation de DbDataReader ou DataSet/DataTable et qui est généralement le code de la clarté, de la moment de la compilation, la vérification de etc. Vous pouvez utiliser les classes wrapper pour votre datareader et en fait, vous pouvez utiliser votre DataReaders un IEnumerable avec eux. Vraiment cool capacité. Ainsi, non seulement vous bénéficiez de taper fort et de la lisibilité du code, vous obtenez également IEnumerable!
Donc une classe pourrait ressembler à ceci.
DataReader Wrapper
J'ai un blog (lien ci-dessus) qui va dans beaucoup plus de détails et je vais faire un générateur de code source pour ces et d'autres DataAccess code de couche.
Vous pouvez utiliser la même technique pour les tables de données (le générateur de code produit code) de sorte que vous pouvez les traiter comme fortement typé DataTable sans les frais de ce VS.NET offre hors de la boîte.
Garder à l'esprit qu'il n'existe qu'une seule instance de la classe wrapper. Si vous n'êtes pas créer des centaines d'instances d'une classe ne à jeter.
Carte le DataReader pour des objets intermédiaires, puis lier votre contrôle à l'aide de ces objets. Il peut être ok pour utiliser des jeux de données dans certaines circonstances, mais ceux-ci sont rares et loin entre le moment où vous avez de bonnes raisons pour l'obtention des données". Quoi que vous fassiez, ne pas passer un DataReader pour vos contrôles à lier au large de (et non pas qui vous a dit que vous étiez considérant que).
Ma préférence personnelle serait d'utiliser un ORM, mais si vous allez à la main, rouler vos données d'accès, par tous moyens, je pense que vous devriez préférer la cartographie DataReaders à des objets de plus en utilisant des ensembles de données. À l'aide de l' .NextResult comme un moyen de limiter vous-même à partir de frappe de la base de données plusieurs fois est une épée à double tranchant cependant, afin de choisir judicieusement. Vous trouverez vous-même de vous répéter, si vous essayez de créer un procs qui toujours saisir exactement ce que vous avez besoin de l'aide d'un seul appel à la base de données. Si votre demande est à seulement quelques pages, il est probablement OK, mais les choses peuvent devenir hors de contrôle rapidement. Personnellement, je préfère avoir un proc par type d'objet, puis appuyez sur la base de données plusieurs fois (une fois pour chaque type d'objet) afin de maximiser la facilité de maintenance. C'est là un ORM brille parce que bon, qui va générer le Sql que vous obtiendrez exactement ce que vous voulez avec un appel dans la plupart des cas.
Si vous n'êtes pas intéressé par la mise à jour ou supprimer les enregistrements que vous avez récupérée à partir de la base de données, je vous recommande d'utiliser DataReader. Fondamentalement DataSet utilise en interne plusieurs Datareaders, donc DataReader devrait vous donner un bon avantage en termes de performance.
Dans presque toutes les situations
DataReader
s sont la meilleure solution pour la lecture à partir d'une base de données.DataReader
s sont plus rapide et nécessitent moins de mémoire queDataTable
s ouDataSet
s.Aussi,
DataSet
s peuvent souvent mener à des situations où l'OO modèle est cassé. Ce n'est pas très orienté objet pour passer autour de données relationnelles/schémas plutôt que des objets qui savent comment manipuler ces données.Donc, pour l'extensibilité, l'évolutivité, modularité, et des raisons de performances, utilisez toujours
DataReader
s si vous considérez-vous comme un Vrai Programmeur™ 😉De vérifier les liens pour les faits et la discussion sur les deux dans la pratique et la théorie.
Indépendamment de savoir si vous êtes aller chercher un résultat unique ou de plusieurs résultats, le consensus semble être d'utiliser un objet DataReader au lieu d'un jeu de données.
Quant à savoir si vous devriez jamais embêter avec plusieurs résultats, de la sagesse, c'est que vous ne devriez pas vous, mais je peux concevoir qu'un délai raisonnable classe d'exceptions à cette règle: (bien) liés à des résultats. Vous ne voulez certainement pas à ajouter une requête pour renvoyer le même ensemble de choix d'une liste déroulante qui est répété sur des centaines, voire des dizaines de pages de votre application, mais plusieurs ensembles de justesse-utilisé peut être avantageusement combiné. Comme exemple, je suis actuellement à la création d'une page pour afficher plusieurs séries de "divergences" pour un lot de l'ETL données. Aucune de ces requêtes sont susceptibles d'être utilisés ailleurs, il serait opportun d'encapsuler comme une seule et même obtenir "écarts" de la procédure stockée. D'autre part, la meilleure performance de le faire peut être négligeable par rapport au travail-autour du naturel d'une procédure stockée-une-suite-définir l'architecture de votre ORM ou roulés à la main code d'accès aux données.
Je suis allé à une méthode qui utilise DataReaders pour tous les appels, j'ai remarqué une nette performance impovement, particulièrement dans les cas où je suis le chargement des listes déroulantes, et d'autres articles simples comme ça.
Personnellement avec plusieurs menus déroulants, en général, je aller pour pullling morceaux individuels de données pour l'obtenir, plutôt que de dire une procédure stockée qui renvoie 5 ensembles de résultats.
Prendre un coup d'oeil dans le TableAdapters qui sont disponibles .NET 2.0 et plus. Ce qu'ils font est de vous donner la force d'un typage fort DataTable et vous permettent de mapper une méthode de Remplissage à qui va utiliser un DataReader pour le charger. Votre méthode de remplissage peuvent être des procédures stockées existantes, votre propre AdHoc SQL, ou même de laisser l'assistant génère le AdHod ou d'une Procédure Stockée pour vous.
Vous pouvez le trouver en commence un nouveau XSD objet DataSet à l'intérieur de votre projet. Pour les tables qui sont utilisés pour plus que juste la recherche, vous pouvez également mapper insérer/mettre à jour/supprimer des méthodes pour le TableAdapter.