Sucession de SQLDataReader

hyipicai Messages postés 13 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 15 décembre 2008 - 10 déc. 2008 à 11:41
hyipicai Messages postés 13 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 15 décembre 2008 - 15 déc. 2008 à 09:56
Bonjour à tous,
J'ai script qui est chargé de supprimer des enregistrements dans une DB selon certains critères.
J'effectue en premier une requête de sélection des enregistrements puis, je vérifie si les enregistrements sont uniques et enfin j'effectue une requete de suppression des enregistrements (différente si l'enregistrement est unique ou non). Le tout est encapsulé dans une transaction SQLServer.
Le problème est que VS m'indique que je peux pas effectuer la seconde requete de sélection car le SQLReader de la première n'est pas fermé ....


commandexe.CommandText = "Select EUOBTRNS_FLOW_ID,EUOBTRNS_NBR from TransactionInQuery where [mailto:QueryNumber=@QueryNB QueryNumber=@QueryNB]";
SqlDataReader readerTrans = (SqlDataReader)commandexe.ExecuteReader();


SqlDataReader reader;
while (readerTrans.Read())
{
   //Create Dbcommand dedicate to the while loop
   DbCommand cmdReader = this.CreateCommandTrans();
   DbCommand cmdDelete = this.CreateCommandTrans();
   cmdReader.Transaction = this.TransSQL;
   cmdDelete.Transaction = this.TransSQL;


   this.AddNewParameter(cmdReader, "TransID", readerTrans["EUOBTRNS_FLOW_ID"]);
   this.AddNewParameter(cmdReader, "TransNumber", readerTrans["EUOBTRNS_NBR"]);
   this.AddNewParameter(cmdDelete, "TransID", readerTrans["EUOBTRNS_FLOW_ID"]);
   this.AddNewParameter(cmdDelete, "TransNumber", readerTrans["EUOBTRNS_NBR"]);


   //Check if the transaction is used by another query
   cmdReader.CommandText = "Select count(*) AS TransCompte from TransactionInQuery where [mailto:QueryNumber=@QueryNB QueryNumber=@QueryNB] and [mailto:EUOBTRNS_FLOW_ID=@TransID EUOBTRNS_FLOW_ID=@TransID] and [mailto:EUOBTRNS_NBR=@TransNumber EUOBTRNS_NBR=@TransNumber]";
   reader = (SqlDataReader)cmdReader.ExecuteReader();
   if (reader.Read())
   {
      int Transcount = reader.GetInt16(0);
      if (Transcount > 1)
      {
          //The transaction is used by another query and then delete only the reference in TransactionInQuery
         cmdDelete.CommandText = "Delete From TransactionInQuery where [mailto:EUOBTRNS_FLOW_ID=@TransID EUOBTRNS_FLOW_ID=@TransID] and [mailto:EUOBTRNS_NBR=@TransNumber EUOBTRNS_NBR=@TransNumber] and [mailto:QueryNumber=@QueryNumber QueryNumber=@QueryNumber];";
         cmdDelete.ExecuteNonQuery();
       }
       else
       {
           //else delete all the references of the transaction
             cmdDelete.CommandText = "Delete From EUOB04TTRANSSTEPLO where [mailto:EUOBTRNS_FLOW_ID=@TransID EUOBTRNS_FLOW_ID=@TransID] and [mailto:EUOBTRNS_NBR=@TransNumber EUOBTRNS_NBR=@TransNumber];";
             cmdDelete.ExecuteNonQuery();
             cmdDelete.CommandText = "Delete From TransactionInQuery where [mailto:EUOBTRNS_FLOW_ID=@TransID EUOBTRNS_FLOW_ID=@TransID] and [mailto:EUOBTRNS_NBR=@TransNumber EUOBTRNS_NBR=@TransNumber] and [mailto:QueryNumber=@QueryNumber QueryNumber=@QueryNumber];";
             cmdDelete.ExecuteNonQuery();
             cmdDelete.CommandText = "Delete From EUOB03TTRANS where [mailto:EUOBTRNS_FLOW_ID=@TransID EUOBTRNS_FLOW_ID=@TransID] and [mailto:EUOBTRNS_NBR=@TransNumber EUOBTRNS_NBR=@TransNumber];";
             cmdDelete.ExecuteNonQuery();
        }
}

Le message d'erreur apparait au niveau de la ligne en bleu ;)


Merci par avance pour votre aide.
Si vous avez besoin d'infos supplémentaire, je suis à votre disposition.
A voir également:

2 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
13 déc. 2008 à 21:02
Salut,

Il ne peut y avoir 2 readers ouverts en même temps sur la même connexion à la base de données (hormis avec MARS à partir de SQL Server 2005, et encore je ne suis pas certains que ça permette de résoudre le problème global ici).
Il faut donc soit :
- s'arranger pour stocker la liste des éléments retournés par la première requête au lieu de les au fur et à mesure via readerTrans, afin de pouvoir ouvrir le second sans problème (en faisant particulièrement attention à l'isolation des données dans la transaction afin de ne pas de conflit avec d'autre requêtes)
- s'arranger pour faire la logique totale en un seul lot de requêtes, pour ne pas faire les aller/retour

/*
coq
MVP Visual C#
CoqBlog
*/
0
hyipicai Messages postés 13 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 15 décembre 2008
15 déc. 2008 à 09:56
ok merci pour ces informations
je vais chercher une solution ;)
0
Rejoignez-nous