140 votes

SqlDataAdapter vs SqlDataReader

Quelles sont les différences entre l'utilisation de SqlDataAdapter vs SqlDataReader pour obtenir des données à partir d'une base?

Je recherche précisément dans leurs avantages et leurs Inconvénients ainsi que leur vitesse de mémoire et de performances.

Merci

204voto

Joel Coehoorn Points 190579

SqlDataReader:

  • Détient la connexion ouverte jusqu'à ce que vous avez terminé (ne pas oublier de le fermer!).
  • Peut généralement être répétées plus d'une fois
  • N'est pas aussi utile pour la mise à jour vers la base de données

D'autre part, il:

  • N'a qu'un seul enregistrement dans la mémoire à un moment plutôt qu'à un ensemble de résultats complet (ce qui peut être énorme)
  • Est à peu près aussi vite que vous pouvez obtenir pour une itération
  • Permet de commencer le traitement des résultats plus rapidement

SqlDataAdapter/DataSet

  • Vous permet de fermer la connexion dès que c'est fait, le chargement des données, et peut même fermer automatiquement pour vous
  • Tous les résultats sont disponibles dans la mémoire
  • Vous pouvez parcourir autant de fois que vous en avez besoin, ou même rechercher un enregistrement spécifique par index
  • A quelques intégré dans les facultés pour la mise à jour vers la base de données

Au prix de:

  • Beaucoup plus l'utilisation de la mémoire
  • Vous attendez jusqu'à ce que toutes les données sont chargées avant d'utiliser tout ça

Alors, vraiment, cela dépend de ce que vous faites, mais j'ai tendance à préférer un DataReader jusqu'à ce que j'ai besoin de quelque chose qui est pris en charge uniquement par un jeu de données. SqlDataReader est parfait pour l'accès aux données courantes cas de la liaison à une grille en lecture seule.

18voto

jaywon Points 3820

La réponse à cette peut être très large.

Essentiellement, la plus grande différence pour moi qui, habituellement, a une influence sur mon décisions sur lequel utiliser, c'est qu'avec un SQLDataReader, vous êtes en "streaming" des données de la base de données. Avec un SQLDataAdapter, vous extrayez les données à partir de la base de données dans un objet qui peut lui-même être interrogé ultérieurement, ainsi que d'effectuer les opérations CRUD sur.

Évidemment, avec un flux de données SQLDataReader est BEAUCOUP plus rapide, mais vous ne peut traiter qu'un seul enregistrement à la fois. Avec un SQLDataAdapter, vous avez une collection complète des lignes correspondantes à votre requête à partir de la base de données pour travailler avec/passer votre code.

AVERTISSEMENT: Si vous utilisez un SQLDataReader, TOUJOURS, toujours, TOUJOURS, assurez-vous que vous écrivez bon code pour fermer la connexion, puisque vous êtes de garder la connexion ouverte avec le SQLDataReader. Défaut de ce faire, ou à la bonne gestion des erreurs pour fermer la connexion en cas d'erreur dans le traitement des résultats de PARALYSER votre application avec connexion fuites.

Pardon pour mon VB, mais c'est le montant minimum de code que vous devez avoir lorsque vous utilisez un SqlDataReader:

Using cn As New SqlConnection("..."), _
      cmd As New SqlCommand("...", cn)

    cn.Open()
    Using rdr As SqlDataReader = cmd.ExecuteReader()
        While rdr.Read()
            ''# ...
        End While
    End Using
End Using

l'équivalent en C#:

using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
    cn.Open();
    using(var rdr = cmd.ExecuteReader())
    {
        while(rdr.Read())
        {
            //...
        }
    }
}

16voto

Wim Hollebrandse Points 8628

Un SqlDataAdapter est généralement utilisé pour remplir un DataSet ou DataTable et ainsi vous aurez accès aux données après votre connexion a été fermée (l'accès déconnecté).

Le SqlDataReader est un fast-forward-only et connecté curseur qui tend à être généralement plus rapide que de remplir un DataSet/DataTable.

En outre, avec un SqlDataReader, vous faire face à vos données d'un enregistrement à la fois, et à ne pas retenir toutes les données en mémoire. Évidemment, avec un DataTable ou le jeu de données, vous disposez d'une allocation de mémoire de frais généraux.

Si vous n'avez pas besoin de conserver les données en mémoire, donc pour le rendu des trucs seulement, aller pour le SqlDataReader. Si vous souhaitez faire face à vos données en mode déconnecté choisir le DataAdapter pour remplir un DataSet ou DataTable.

11voto

AdaTheDev Points 53358

Utiliser un SqlDataAdapter quand on veut remplir un DataSet en mémoire/Table de la base de données. Ensuite, vous aurez la flexibilité de fermer/disposer de la connexion, passer le datatable/set autour de la mémoire. Vous pouvez ensuite manipuler les données et de persister dans le DB à l'aide de la carte de données, en collaboration avec InsertCommand/UpdateCommand.

Utiliser un SqlDataReader lorsque l'on veut rapide, à faible empreinte mémoire d'accès aux données sans le besoin de flexibilité pour, par exemple, circuler les données de votre logique métier. C'est plus optimal pour rapide, faible utilisation de la mémoire de récupération de gros volumes de données qu'il ne charge pas toutes les données en mémoire tout en un aller - avec le SqlDataAdapter approche, l'ensemble de données/DataTable serait rempli avec toutes les données donc si il y a beaucoup de lignes et de colonnes, qui nécessitent beaucoup de mémoire pour contenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X