Quelle est la principale différence entre ces deux méthodes? Sur le site Web de msdn, il est expliqué comme ci-dessous, mais je ne le comprends pas.
Read
Avance le SqlDataReader à l'enregistrement suivant. (Substitue DbDataReader.Read ().)
NextResult
Fait avancer le lecteur de données vers le résultat suivant, lors de la lecture des résultats des instructions Transact-SQL par lots. (Substitue dbDataReader.NextResult ().)
Si votre instruction/proc renvoie plusieurs jeux de résultats, par exemple, si vous avez deux instructions select
dans un seul objet Command
, vous récupérerez deux jeux de résultats.
NextResult
est utilisé pour se déplacer entre les jeux de résultats.Read
est utilisé pour avancer dans les enregistrements d'un seul jeu de résultats.Prenons l'exemple suivant:
Si vous avez un proc dont le corps principal est comme:
.... Proc start
SELECT Name,Address FROM Table1
SELECT ID,Department FROM Table2
-- Proc End
L'exécution du processus ci-dessus produirait deux jeux de résultats. Un pour Table1
ou première instruction select et autre pour l'instruction select
suivante.
Par défaut, le premier jeu de résultats serait disponible pour Read
. Si vous souhaitez passer au deuxième jeu de résultats, vous aurez besoin de NextResult
.
Voir: Récupération de données à l'aide d'un DataReader
Exemple de code du même lien : Récupération de plusieurs jeux de résultats à l'aide de NextResult
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();
while (reader.HasRows)
{
Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
reader.GetName(1));
while (reader.Read())
{
Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
reader.NextResult();
}
}
}
Pas strictement une réponse à cette question, mais si vous utilisez la méthode DataTable.Load pour consommer les données du lecteur plutôt que Reader.Read noter qu'après la fin de la méthode Load, le lecteur est maintenant placé au début du jeu de résultats suivant afin vous ne devez pas appeler la méthode NextResult sinon vous sauterez le prochain jeu de résultats.
Une simple boucle sur Reader.HasRows autour d'un appel DataTable.Load est tout ce dont vous avez besoin pour traiter plusieurs jeux de résultats potentiels dans ce scénario.