Question

Je n'ai pas été en mesure de trouver explicitement mentionné nulle part encore, mais un tas d'exemples que j'ai trouvé suivre en ligne ce que je fais.

J'ai une classe C # qui utilise ODP.net pour se connecter à un DB Oracle et exécuter une procédure qui est dans un paquet.

Mon colis a des procédures stockées qui prennent un ref paramètre de sortie du curseur. Toute la procédure n'est d'ouvrir le curseur pour une instruction select particulier.

Si j'exécute cette procédure directement sur le db oracle, puis finalement je vais frapper un nombre maximum d'erreur de curseurs ouverts.

Je me demandais si ODP.net ne fait près ce curseur qui a été ouvert dans ma procédure?

Je suis en utilisant la méthode OracleDataApaper.Fill (DataSet).

par exemple.

DataSet ds = new DataSet();
OracleConnection conn = new OracleConnection(this.connStr);
OracleCommand com = new OracleCommand("MYPKG.MYQUERY", conn);
OracleDataAdapter adapter = new OracleDataAdapter(com);
conn.Open();
com.Parameters.Add("searchParam", OracleDbType.Varchar2).Value = "myName";
com.Parameters.Add("outCursor", OracleDbType.RefCursor, ParameterDirection.Output);
com.CommandType = CommandType.StoredProcedure;

adapter.Fill(ds);
conn.Close();




PROCEDURE GETALLEMAILS(searchParamIN VARCHAR2, outCursor OUT sys_refcursor) AS
  BEGIN
    open outCursor
      select 
        EAEMAL as Email
      from 
        EmailTable
      where 
        EmailName = searchParam;  
  END GETALLEMAILS;

Je suis juste peur de laisser derrière les curseurs ouverts sur la base de données est tout. Si quelqu'un peut fournir des liens vers des documents officiels, ce serait génial!


Mises à jour:

Merci pour l'entrée. J'appelle

com.Dispose();
conn.Close();
conn.Dispose();

mais laissés sur mon exemple.

J'ai trouvé ce post sur le forum, ce qui indique que la méthode OracleDataAdapter.Fill (Dataset) ne libère le curseur ref après la méthode de remplissage () a été exécuté.
http://www.frontoracle.com/oracle- archive / 140/386140-close-ref-cursor.html

Je souhaite la documentation Oracle était plus explicite pour décrire ce processus bien.

Était-ce utile?

La solution

ODP.NET vous oblige à nettoyer les choses. Alors vous:

  • doivent disposer d'instances OracleParameter, car ils contiennent des ressources non gérées (!) Et Odp.net ne le fait pas
  • doivent disposer des objets OracleCommand, car ils contiennent trop de ressources non gérés et la fermeture d'une connexion ne se ferme pas ces
  • curseurs ouverts ne peuvent pas vivre sans une connexion ouverte, mais en rien odp.net est nettoyée après une ferme de connexion (ou est disposé à), de sorte que vous devez nettoyer ces derniers aussi (et avant que la connexion se ferme bien sûr) .

I.o.w .: Nettoyons ce que vous créez.

Il peut être le OracleDataAdapter fait déjà pour vous, mais ne sait pas (et les documents ODP.Net ne dis pas cela, si vous avez de vérifier le (code illisible) avec réflecteur pour être sûr. Bien que la règle de pouce avec odp.net: pour éviter les fuites de mémoire, appelez toujours disposer, sur tout dans l'ordre. paramètre, curseur, commande, transaction, connexion

Autres conseils

Je ne sais pas si vous avez trébuché sur cet article , et il ne vise pas directement à votre question, mais il illustre quelque chose que j'appris en travaillant avec ODP.Net: en cas de doute, toujours à proximité (connexions) et éliminer. Chaque méthode que j'écris qui utilise une instance de connexions ODP, les commandes et / ou les curseurs a un tout enfin clause disposition.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top