Maison >base de données >tutoriel mysql >Pourquoi le message « DataReader doit être fermé en premier » se produit-il et comment puis-je le résoudre ?

Pourquoi le message « DataReader doit être fermé en premier » se produit-il et comment puis-je le résoudre ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-30 11:24:13770parcourir

Why Does

Exception de gestion des données : compréhension et résolution de l'erreur « DataReader doit être fermé en premier »

Dans le code fourni, vous tentez d'exécuter un nouveau Instruction SQL utilisant ExecuteNonQuery() alors qu'un DataReader est toujours ouvert pour la même connexion. Cela déclenche l'exception : "Il existe déjà un DataReader ouvert associé à cette connexion qui doit d'abord être fermé."

Selon MSDN, cette exception se produit car lorsqu'un DataReader est ouvert, la connexion qu'il utilise est verrouillée exclusivement. pendant toute la durée de son utilisation. Cela signifie qu'aucune autre commande, y compris la création d'un nouveau DataReader, ne peut être exécutée pour cette connexion tant que le DataReader d'origine n'est pas fermé.

Pour résoudre cette erreur, vous devez vous assurer que le DataReader est fermé avant de tenter d'exécuter un autre commandes sur la même connexion. Dans le code fourni, cela peut être réalisé en ajoutant un appel à myReader.Close() immédiatement avant la ligne qui lève l'exception :

myCommand.Dispose();
myReader.Close(); // Close DataReader
if (myReader.HasRows) {
    int i = 0;
    // Always call Read before accessing data.
    while (myReader.Read()) {
        if (myReader["frProductid"].ToString() == "") //there is no productid exist for this item
        {
            strInsertSQL = "Insert Into tblProduct_temp (Productid) Values('this istest') ";
            MySqlCommand cmdInserttblProductFrance = new MySqlCommand(strInsertSQL, myConnection);
            cmdInserttblProductFrance.ExecuteNonQuery(); // ExecuteNonQuery after closing DataReader
        }
    }
}

En fermant le DataReader avant d'exécuter la commande ExecuteNonQuery(), vous libérez le verrou exclusif sur la connexion et autorisez l'exécution réussie de la nouvelle commande.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn