ORA-01000 : Trop de curseurs ouvert

Signaler
Messages postés
107
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
15 juillet 2009
-
samytto
Messages postés
4
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
14 avril 2011
-
Bonjour,

Dans une boucle infinie (while), je vais lire dans une base de données Oracle.
Mais une erreur apparait après un certain nombre de passage.
Pouvez-vous me dire comment fermer les CURSEUR???


Erreur : ORA-01000: Nombre maximum de curseurs ouverts atteint

while()
{
         try
         {
               
string cde = "SELECT * FROM SMS_MO";
               OracleDataAdapter da =
new OracleDataAdapter(cde, ConStr);
               OracleConnection con = da.SelectCommand.Connection;
               con.Open();
               da.SelectCommand.ExecuteReader();
               DataSet ds =
new DataSet();
               da.Fill(ds,"SMS_MO");      //Erreur ICI






               //Traitement








               con.Close();

//Ferme la connexion

      }


        catch
(Exception e)
      {
               Console.WriteLine(e.Message);
      }
} HELP HELP HELP



>> NiCoMpX <<

6 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
normal...

à aucun moment tu ne le fais de dispose sur ta connection.

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
107
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
15 juillet 2009

J'avais déja essayé le code suivant, mais toujours le meme résultat

while()
{
         try
         {
               
string cde = "SELECT * FROM SMS_MO";
               OracleDataAdapter da =
new OracleDataAdapter(cde, ConStr);
               OracleConnection con = da.SelectCommand.Connection;
               con.Open();
               da.SelectCommand.ExecuteReader();
               DataSet ds =
new DataSet();
               da.Fill(ds,"SMS_MO");      //Erreur ICI

               //Traitement

               ds.Dispose();
               da.Dispose();
               con.Dispose();

               
               con.Close(); //Ferme la connexion
      }

        catch(Exception e)
      {
               Console.WriteLine(e.Message);
      }
}

>> NiCoMpX <<
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
hum... en même temps, c'est pas très "optimisé" comme code... tu passes plus de temps à ouvrir et fermer ta connexion qu'à récupérer les données !

string cde = "SELECT * FROM SMS_MO";
OracleDataAdapter da =
new OracleDataAdapter(cde, ConStr);
OracleConnection con = da.SelectCommand.Connection;
con.Open();

try {
    while()
    {

               da.SelectCommand.ExecuteReader();
               DataSet ds =
new DataSet();
               da.Fill(ds,"SMS_MO");      //Erreur ICI

// Insert ici une pause... sinon t'es pas prêt de bosser ;)

    }
} catch (Exception ex) {
    Console.WriteLine(ex.Message);
} finally {
    con.Close();
}

ds.Dispose();
da.Dispose();
con.Dispose();

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
107
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
15 juillet 2009

La pause que tu me fais insérer ne vas faire que de retarder le moment où trop de curseur seront ouvert!?!


Comment régler le problème?

>> NiCoMpX <<
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
en fait, ton code comporte plusieurs problèmes...

1. je ne suis pas sur que ta base de données (et ton DBA ;) ) va apprécier longtemps que tu lui demandes 100 fois par secondes la même requête ! C'est pour ça que mettre une pause de 1 seconde entre chaque tour ne me semble pas "mortel"

2. j'ai un gros doute quant à l'utilise de ton objet "con"... puisque le DataAdapter gère tout seul l'ouverture et la fermeture de la connexion. (pareil pour le ExecuteReader...)

3. L'utilisation des boucles infinies est très dangeureuse et pénalise les performances.

Mes conseils :

1. à la place de la boucle infinie, utilise plutot un timer... c'est plus "fiable" et surtout ca évite de bloquer ton prog et la machine qui l'exécute.

2. Soit tu utilises le mode connecté (donc Connection + Reader) soit tu utilises le mode déconnecté (DataSet + DataAdapter)... en aucun cas, tu fais un mix des 2 !

Voici un exemple :

private void myTimer_Tick(object sender, EventArgs e) {
    da.Fill(ds, "SMS_MO");
}

et dans le constructeur de ton formulaire (ou de ta classe) :

string cde = "select * from SMS_MO";
da = new OracleDataAdapter(cde, ConStr);

et biensur tu déclares en private en haut de la classe :

private OracleDataAdapter da;
private DataSet ds;

Sébastien.

Sébastien FERRAND (
blog)
Consultant Indépendant
[Microsoft MVP Visual C#]
Messages postés
4
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
14 avril 2011

J'ai eu le même problème alors j'ai fermé mes Statements après chaque utilisation et sa a marché