2009-07-27 5 views
1

J'utilise un SqlDataReader pour remplir une entité dans une application Winform. La classe d'entité a plusieurs attributs de clé étrangère dans la base de données que je veux configurer en tant que propriétés dans la classe d'entité. Chaque propriété sera de type 'Attribute' avec une propriété de description ID &.Plusieurs appels SQlCommand.ExecuteReader ou faites-le une fois avec datareader.NextResult()?

Certains des utilisateurs du système sont éloignés de la base de données, de sorte que les performances d'accès aux données sont une considération sérieuse.

Je pouvais soit exécuter le SqlCommand.ExecuteReader plusieurs fois (une fois pour chaque attribut) par rapport à un proc stocké qui retourne un seul resultset, soit exécuter le SqlCommand.ExecuteReader une fois contre un proc stocké qui renvoie plusieurs ensembles de résultats et utilise SqlDataReader.NextResult pour les parcourir et configurer les attributs.

Si je fais une boucle avec .NextResult, je rencontre des problèmes en m'assurant que le proc stocké et la boucle d'affectation de propriété sont alignés. Si l'ordre des instructions SELECT dans l'ordre de changement de proc, alors l'ordre d'affectation dans l'application winform serait foiré.

Si le SqlDataReader retourne quand même à la base de données pour chaque lecture, y a-t-il beaucoup de temps pour l'exécution de SqlCommand.ExecuteReader? Faire un ExecuteReader pour chaque attribut rendrait les choses plus claires du côté des affectations.

Merci!

Répondre

1

Avec .Nextresult, ADO.Net ne retourne pas à la base de données pour chaque jeu de résultats. Toute cette logique se trouve dans le fournisseur de données ADO.Net, où que ce soit en cours d'exécution (dans votre couche d'accès aux données, probablement sur votre serveur d'applications, ou dans votre couche d'interface)

si vous exécutez le lecteur de données plusieurs fois, Cependant, vous effectuerez un seul voyage dans la base de données pour chaque appel. Donc, si la couche où ce code s'exécute est à une certaine distance (en aller-retour) de la DB, il vaut mieux utiliser la technique .NextResult.

Vous devriez également envisager d'utiliser un DataSet (avec plusieurs DataTables) au lieu d'un lecteur de données .... vous pourriez trouver cela plus performant.

+2

Je suis curieux: Quand est-ce que l'utilisation d'un DataSet (avec DataAdapter) serait plus "performante" que l'utilisation d'un DataReader? C'est juste que puisque le DataAdapter utilise le DataReader en dessous, je me demande quelle magie mystique le fait fonctionner plus vite pour le DataAdapter mais pas pour le code de fin de l'utilisateur? –

+0

Pour être honnête, je ne suis pas exactement sûr, mais (et ce qui suit est une supposition) il pourrait être parce que le code dans le fournisseur ADO.Net qui 'remplit' le dataset avec des données est optimisé (peut-être écrit en C++/assembly ?) pour le faire rapidement et ensuite déconnecter de la base de données, alors que lorsque vous utilisez un lecteur de données, vous devez écrire ce code vous-même, en utilisant des appels aux classes du framework CLR std, et votre code ne peut pas se déconnecter. enregistrer dans le lecteur ... –

+0

Et pour toute application qui crée potentiellement plusieurs connexions DB, ce qui affecte le plus l'évolutivité n'est pas ce que les connexions font mais combien de temps elles restent ouvertes. –

Questions connexes