web-dev-qa-db-fra.com

Différence entre SqlDataReader.Read et SqlDataReader.NextResult

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 ().)

32
Ozkan

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();
        }
    }
}
46
Habib

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.

1
Bob B