Récupération de données par un DataReader
S'applique à : .NET Framework .NET .NET Standard
Pour récupérer des données en utilisant un DataReader, créez une instance de l’objet Command, puis créez un DataReader en appelant Command.ExecuteReader pour extraire des lignes d’une source de données. Le DataReader fournit un flux de données sans mise en mémoire tampon qui permet à la logique procédurale de traiter efficacement les résultats provenant d’une source de données de façon séquentielle.
Notes
Le DataReader se révèle être un bon choix quand vous récupérez de grandes quantités de données, car celles-ci ne sont pas mises en cache dans la mémoire.
Voici un exemple d’utilisation d’un DataReader où reader
représente un DataReader valide et où command
représente un objet Command valide.
reader = command.ExecuteReader();
Utilisez la méthode DataReader.Read pour obtenir une ligne des résultats de la requête. Vous pouvez accéder à chaque colonne de la ligne retournée en passant le nom ou la référence ordinale de la colonne au DataReader. Cependant, pour permettre de meilleures performances, le DataReader fournit une série de méthodes qui vous permettent d’accéder aux valeurs des colonnes dans leurs types de données natifs (GetDateTime, GetDouble, GetGuid, GetInt32, etc.). Pour obtenir une liste de méthodes d’accesseur typées pour les DataReaders spécifiques au fournisseur de données, consultez SqlDataReader. L’utilisation des méthodes d’accesseur typées quand vous connaissez le type de données sous-jacent réduit la quantité des conversions de type nécessaires lors de l’extraction de la valeur de colonne.
L’exemple de code suivant boucle dans un objet DataReader et retourne deux colonnes à partir de chaque ligne.
static void HasRows(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Check if the DataReader has any row.
if (reader.HasRows)
{
// Obtain a row from the query result.
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
}
else
{
Console.WriteLine("No rows found.");
}
// Always call the Close method when you have finished using the DataReader object.
reader.Close();
}
}
Fermer le DataReader
Appelez toujours la méthode Close()
quand vous avez fini d’utiliser l’objet DataReader
.
Notes
Si votre Command contient des paramètres de sortie ou des valeurs de retour, ces valeurs ne sont pas disponibles tant que le DataReader n’est pas fermé.
Important
Pendant qu’un DataReader est ouvert, la Connexion est utilisée exclusivement par ce DataReader. Vous ne pouvez pas exécuter de commandes pour la Connexion, y compris créer un autre DataReader, tant que le DataReader d’origine n’est pas fermé.
Notes
N’appelez pas Close ou Dispose sur une Connexion, sur un DataReader ou sur tout autre objet géré dans la méthode Finalize de votre classe. Dans un finaliseur, libérez seulement les ressources non managées que votre classe possède directement. Si votre classe ne possède pas de ressources non gérées, n’incluez pas de méthode Finalize dans la définition de votre classe. Pour plus d’informations, consultez Nettoyage de la mémoire.
Récupération plusieurs jeux de résultats en utilisant NextResult
Si le DataReader retourne plusieurs jeux de résultats, appelez la méthode NextResult pour boucler séquentiellement dans les jeux de résultats. L'exemple suivant montre l'objet SqlDataReader traitant les résultats de deux instructions SELECT utilisant la méthode ExecuteReader.
static void RetrieveMultipleResults(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM dbo.Categories;" +
"SELECT EmployeeID, LastName FROM dbo.Employees",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Check if the DataReader has any row.
while (reader.HasRows)
{
Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
reader.GetName(1));
// Obtain a row from the query result.
while (reader.Read())
{
Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
// Hop to the next result-set.
reader.NextResult();
}
// Always call the Close method when you have finished using the DataReader object.
reader.Close();
}
}
Obtenir des informations de schéma auprès du DataReader
Pendant qu’un DataReader est ouvert, vous pouvez extraire des informations de schéma sur le jeu de résultats actif en utilisant la méthode GetSchemaTable. GetSchemaTable retourne un objet DataTable rempli de lignes et de colonnes qui contiennent les informations de schéma pour le jeu de résultats actif. La DataTable contient une ligne pour chaque colonne du jeu de résultats. Chaque colonne de la table du schéma est mappée à une propriété des colonnes retournées dans les lignes du jeu de résultats, où ColumnName est le nom de la propriété et où la valeur de la colonne est la valeur de la propriété. L’exemple de code suivant écrit les informations de schéma pour DataReader.
static void GetSchemaInfo(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
// Retrieve schema information about the current result-set.
DataTable schemaTable = reader.GetSchemaTable();
foreach (DataRow row in schemaTable.Rows)
{
foreach (DataColumn column in schemaTable.Columns)
{
Console.WriteLine(String.Format("{0} = {1}",
column.ColumnName, row[column]));
}
}
// Always call the Close method when you have finished using the DataReader object.
reader.Close();
}
}