ADO.NET les données en tableau ou de lecteur de données
DataReader est plus efficace qu'une DataTable si vous avez seulement besoin de montrer des données, mais pas de la manipuler. Cependant, pour obtenir un DataReader de la couche d'accès aux données dois-je laisser la connexion ouverte objet? Je pense que c'est aussi un très gros problème d'efficacité. Donc, il y a une autre approche afin de profiter pleinement de la DataReader?
OriginalL'auteur erasmus | 2010-03-10
Vous devez vous connecter pour publier un commentaire.
Oui, le lecteur de données est certainement le plus efficace - mais vous ne pas voulez garder une connexion ouverte pendant une longue période de temps!
DataReader
pour lire vos données dans un objet entité; ouvrir la connexion, lire les données, fermer la connexionC'est probablement le plus efficace que vous pouvez obtenir - c'est un peu de travail, du code ennuyeux, et tout, mais c'est à peu près aussi vite qu'il peut l'être.
Si vous êtes plus intéressé dans la productivité des développeurs de vitesse brute, pourquoi ne pas utiliser un certain type d'un ORM pour faire tout cela ennuyeux, ennuyeux cartographie d'avant en arrière? Enregistre vous beaucoup de codage et de désordre de trucs pour maintenir la!
Si c'est vraiment un petit projet, ne vous inquiétez pas au sujet de l'efficacité. Utilisez simplement ce qui est le plus facile pour vous. Il n'y a pas de règle que chaque application doit s'exécuter aussi bien qu'il le peut. Le seul espoir est qu'il effectue en tant que bien comme il se doit afin de répondre aux besoins attendus.
d'accord avec Mike - le plus petit, le projet, le moins que l'essentiel est que le dernier bit de la performance. L'utilisation de Linq-to-SQL, NHibernate, ou quelque chose - c'est juste bien plus facile de faire les choses qui est certainement plus important dans un petit projet
belle explication. Merci.
OriginalL'auteur marc_s
Je ne laisse jamais un DataReader dans la nature (de la DAL). Seulement une question de temps avant que vous êtes en laissant ouvertes les connexions quelque part. Aussi, je suis presque jamais traiter avec autant de données sur un seul appel où le passage autour d'un DataTable ou le jeu de données présente un problème.
Nous sommes à l'aide d'un langage orienté objet et le DAL peut vraiment prendre avantage de cela. Il ne devrait être qu'une ligne de code dans votre projet qui obtient la chaîne de connexion. Un seul objet qui touche en fait à la base de données (appels ExecuteNonQuery, DA.Fill(), etc.)
Ceci vous permet également d'obtenir assez impliqué avec la journalisation des exceptions, etc. parce que vous êtes seulement le faire une fois. Donc à l'un DAL de la classe de base que j'utilise pour tous mes DAL objet dans l'ensemble de mon projet, j'ai la logique que si le DAL déclenche une exception alors qu'il est connecté à une table dans ma base de données. Cet enregistrement échoue sur un fichier texte si l'enregistrement de base de données échoue.
Depuis que j'ai encapsuler tout cela, mon code pour obtenir les données ressemble maintenant à:
(ou, plus probablement, d'un BAL de l'objet se trouve entre les 2). Le DB est un objet normal (non statique), mais il ne instancié qu'une seule fois par l'application.
Affaires De La Couche Application
jamais entendu parler de ce terme. Utilisé pour "couche", "domaine", "modèle", etc plus. J'espère qu'ils sont les mêmes.
N'oubliez pas d'utiliser l', ahem, à l'AIDE de la commande. Vous n'aurez pas besoin de fermer la connexion avec elle.
OriginalL'auteur JBrooks
Laissez votre couche de données de retour objets, pas de tables de données ou de données lecteurs. Je vous suggère de remplir vos objets à l'aide d'un lecteur de données.
il n'y a pas de domaine objet ici si vous voulez dire des entités.
c'est un tout autre question, mais la réponse est généralement pas.
+1 @Keith Rousseau.
votre couche de la Vue ne doit pas s'appuyer sur la structure spécifique des tables sur lesquelles votre couche de Données est construit. Cependant, si par "des objets du domaine" tu veux dire que le business objects (ou "modèles"), alors, oui, ce sont les lingua franca pour la communication entre l'INTERFACE utilisateur et la BLL. Maintenant, vous trouverez de nombreux cas où le mapping à partir d'objets de données sur modèles (objets du domaine) est assez trivial et vous serez tenté de sauter les formalités, mais à ne pas vous serez heureux que vous avez gardé séparé en bas de la route.
OriginalL'auteur Robert
Ce que j'ai l'habitude de faire est d'ouvrir le lecteur avec CommandBehavior.CloseConnection. Alors je passe par le lecteur et lire les données dans mon propre modèle d'objet ou de la liste ou que ce soit dans la mémoire avec les données et fermez le lecteur. Il fait bien de la même chose que d'un tableau de données, mais j'ai juste la haine de traiter avec pléthorique et peu de type de données stuctures.
OriginalL'auteur Mike Mooney
Laissez-nous avoir une idiot de référence de vérifier à combien plus le DataReader (.Net version 4) est.
Je l'ai récupéré un enregistrement de la base de données (SQL Server 2000) et de lire tous ses domaines. J'ai répété ce processus de 1000 fois. DataReader a pris 17.3327585 secondes et DataTable a pris 18.37320156 et donc DataReader est ~1.04 secondes plus rapide que DataTable pour 1000 lit.
Donc, on pourrait obtenir un gain de performance de 0.00104 secondes si DataReader est préféré au cours de DataTable.
Regarder Est DataSet plus lent que DataReader en raison de...? ainsi
OriginalL'auteur bjan
Quand j'ai fait des recherches avant, je crois que j'ai découvert que la différence de performances entre DataReader et DataTable banal, sauf peut-être de très grandes quantités de données. Depuis, j'ai généralement utilisé DataTable car il est plus complet, peut être travaillé avec déconnecté, etc.
OriginalL'auteur alchemical
Si vous voulez complètement abstraites, des connexions et de la cérémonie de ADO.NET le DataReader est un défi de taille. Je n'aime vraiment pas mon outil de données ayant une connexion ouverte sur le lâche, en espérant DataReader est éliminé (en supposant que vous avez utilisé l'option CommandBehavior.CloseConnection). Aussi, lors de l'utilisation de beaucoup de DataReaders, il est difficile de pool de connexions, puisque vous ne pouvez pas faire n'importe quoi avec la connexion jusqu'à ce que le précédent DataReader est fermé. Ils ne peuvent pas être transmis facilement. Vos Données-outil n'est pas un vrai abstraction.
DataTables d'autre part, sont extrêmement flexible et peut faire pour certains très efficace, un code clair. Linq-To-DataTable est grande. Heureusement, la DataTable est en fait assez efficace. Pour les non-énormes résultats, il est presque aussi rapide que le datareader. (cela dépend bien sur exactement ce que vous faites.) De plus en plus et je reçois des tables de données à partir de mes données-outil plutôt que de Lecteurs. Il rend la vie simple. Je peux continuer à utiliser la même connexion ouverte. Il n'y a pas un "état" dans les données de l'outil.
Le code pour l'obtention d'un DataReader est très simple. Alors, quand j'ai vraiment besoin d'un DataReader (pas souvent), je viens de laisser mon DAL-moi ma connexion et j'ai mes DataReader moi-même.
Rousseau, il semble que nous allons être en désaccord. Pour l'instanciation d'un seul ou un petit nombre d'objets, datatables donner de la simplicité et de la flexibilité. Peut-être que vous voulez que vos données au format XML? De DataTable, pas de problème. L'efficacité est au rendez-vous de DataReaders est souvent de petite taille et pas la peine.
Je peux venir avec un grand nombre d'exemples. Avec des datarow vous pouvez avoir fantastique de flexibilité dans la construction de vos objets; vous pouvez construire une tonne d'objets à partir d'un db-requête et un seul LINQ déclaration. L'efficacité est au rendez-vous de DataReaders est souvent de petite taille et pas la peine. Si par lazy tu veux dire la construction de nombreux objets avec un petit la quantité de code qui est très clair et sans possibilité de programmeurs juniors en laissant les connexions de la pendaison de l'ouvrir, alors oui, je suis paresseux. Je veux le faire rapidement, clairement et sans problèmes.
Mon problème avec les tables de données n'a rien à voir avec l'efficacité. C'est sur le code de la maintenabilité et de l'utilisation de la magie des cordes. Vous perdez taper fort, ce qui vous obtenez de retour des objets de la Couche d'Accès aux Données. Cela rend pour un code qui est beaucoup plus difficile à maintenir, étendre et de débogage.
Je n'arrive pas à comprendre d'où vous venez de. Bien sûr, vous travail objets fortement typés dans une logique d'entreprise et de l'INTERFACE utilisateur. Mon ADO.NET le travail ne sert qu'à mettre les données dans des objets, et il semble que vous êtes de la même manière. Mais à un certain point, que ce soit dans la méthode de fabrique, ou à l'intérieur de vos objets ou partout où vous êtes l'obtention de données de la db. Cette question a été de savoir, si vous utilisez un outil de résumé de votre ASP.NET travail, que ce soit pour aller avec DataReaders ou de tables de données. Quand je suis à la pelle des données dans mes objets pour les niveaux supérieurs de travailler avec, je suis la recherche tables de données sont le plus souvent mieux.
OriginalL'auteur Patrick Karcher
Directement à partir de la documentation:
Bien parler
DataSet
en gros, la plupart de qu'il détient pourDataTable
trop. À partir d'un angle de l'efficacité, ici est rare d'analyse comparative à partir de msdn lui-même. La ligne de fond estDataReader
est légèrement plus rapide, et si ça..Voir cette question trop ce qui suggère une cool Orm et le benchmarking.
OriginalL'auteur nawfal
C'est le même que j'ai posté ici.
J'ai fait un peu de benchmarking moi-même avec des approches différentes:
1 et 2 retours
DataTable
tandis que le reste fortement typé ensemble de résultats, de sorte que son exactement pas des pommes avec des pommes, mais j'ai tout le temps en conséquence.Seulement l'essentiel:
La requête a retourné environ 1200 lignes et 5 champs (run de 100 fois). En dehors de
Read1
tous de bons résultats. De tous, je préfèreRead3
qui renvoie des données paresseusement, comme indiqué. Ce qui est excellent pour la mémoire si vous avez seulement besoin de les énumérer. Pour avoir une copie de la collection dans la mémoire, vous êtes mieux avecRead4
ouRead5
comme vous s'il vous plaît.OriginalL'auteur nawfal