Réponses:
D'autre part, il:
Au prix de:
Donc, cela dépend vraiment de ce que vous faites, mais j'ai tendance à préférer un DataReader jusqu'à ce que j'aie besoin de quelque chose qui n'est pris en charge que par un ensemble de données. SqlDataReader est parfait pour le cas commun d'accès aux données de liaison à une grille en lecture seule.
Pour plus d'informations, consultez la documentation officielle de Microsoft .
while (reader.Read())
boucle.
La réponse à cela peut être assez large.
Essentiellement, la différence majeure pour moi qui influence habituellement mes décisions sur l'utilisation est qu'avec un SQLDataReader, vous «diffusez» des données de la base de données. Avec un SQLDataAdapter, vous extrayez les données de la base de données dans un objet qui peut lui-même être interrogé davantage, ainsi que d'effectuer des opérations CRUD sur.
Évidemment, avec un flux de données, SQLDataReader est BEAUCOUP plus rapide, mais vous ne pouvez traiter qu'un seul enregistrement à la fois. Avec un SQLDataAdapter, vous disposez d'une collection complète des lignes correspondantes à votre requête à partir de la base de données pour travailler avec / passer par votre code.
AVERTISSEMENT: si vous utilisez un SQLDataReader, TOUJOURS, TOUJOURS, TOUJOURS assurez-vous que vous écrivez le code approprié pour fermer la connexion puisque vous maintenez la connexion ouverte avec SQLDataReader. Si vous ne le faites pas, ou une gestion correcte des erreurs pour fermer la connexion en cas d'erreur dans le traitement des résultats, votre application sera CRIPPLE avec des fuites de connexion.
Pardonnez mon VB, mais c'est la quantité minimale de code que vous devriez avoir lors de l'utilisation d'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
équivalent C #:
using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
cn.Open();
using(var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
{
//...
}
}
}
Un SqlDataAdapter est généralement utilisé pour remplir un DataSet ou DataTable et vous aurez donc accès aux données une fois votre connexion fermée (accès déconnecté).
Le SqlDataReader est un curseur à avance rapide uniquement et connecté qui a tendance à être généralement plus rapide que le remplissage d'un DataSet / DataTable.
De plus, avec un SqlDataReader, vous traitez vos données un enregistrement à la fois et ne gardez aucune donnée en mémoire. Évidemment, avec un DataTable ou un DataSet, vous avez une surcharge d'allocation de mémoire.
Si vous n'avez pas besoin de conserver vos données en mémoire, donc pour le rendu uniquement, optez pour le SqlDataReader. Si vous souhaitez traiter vos données de manière déconnectée, choisissez le DataAdapter pour remplir un DataSet ou DataTable.
Utilisez un SqlDataAdapter lorsque vous souhaitez remplir un DataSet / DataTable en mémoire à partir de la base de données. Vous avez alors la possibilité de fermer / supprimer la connexion, de transmettre la table de données / l'ensemble en mémoire. Vous pouvez ensuite manipuler les données et les conserver dans la base de données à l'aide de l'adaptateur de données, en conjonction avec InsertCommand / UpdateCommand.
Utilisez un SqlDataReader lorsque vous souhaitez un accès rapide aux données à faible encombrement mémoire sans avoir besoin de flexibilité pour, par exemple, transmettre les données autour de votre logique métier. Ceci est plus optimal pour une récupération rapide et à faible utilisation de la mémoire de gros volumes de données car il ne charge pas toutes les données en mémoire en une seule fois - avec l'approche SqlDataAdapter, le DataSet / DataTable serait rempli avec toutes les données, donc si il y a beaucoup de lignes et de colonnes, qui nécessiteront beaucoup de mémoire.
La fonction Fill utilise un DataReader en interne. Si votre considération est "Laquelle est la plus efficace?", Alors l'utilisation d'un DataReader dans une boucle serrée qui remplit une collection enregistrement par enregistrement, est susceptible d'être la même charge sur le système que l'utilisation de DataAdapter.Fill.
(System.Data.dll, System.Data.Common.DbDataAdapter, FillInternal.)