Voil� un exemple de r�ponse, dont tout le monde ne peut pas profiter � cause
de mon probl�me de messagerie. D�sol� ;)!
Laurent For�t.
----- Original Message -----
From: "Dominique Gallot" <[EMAIL PROTECTED]>
To: "Laurent For�t" <[EMAIL PROTECTED]>
Sent: Friday, March 07, 2003 3:41 PM
Subject: Re: Resultset et close()
>
> Faire ceci
>
> ..........
>
>
> Simple non ? En tout cas c'est une tres bonne facon de faire, avec un
Proxy
> !
>
> Dominique
> -------------------------------------------- SAVE THIS TO Test.java
> ---------------------------
>
>
>
> import java.lang.reflect.*;
> import java.sql.*;
>
> public class Test
> {
> static class ClosedResultSet implements InvocationHandler
> {
> private Object obj;
> public boolean closed = false;
> public ClosedResultSet (Object o )
> {
> obj = o;
> }
> public Object invoke(Object proxy, Method m, Object[] args) throws
> Throwable
> {
> Object result;
> try {
> result = m.invoke(obj, args);
> if ( m.getName().equals("close") )
> {
> closed = true;
> }
> } catch (InvocationTargetException e) {
> throw e.getTargetException();
> }
> return result;
> }
> public boolean isClosed()
> {
> return closed;
> }
>
> }
>
> public static void maMethodQuiPeutFermer(ResultSet rs) throws
> SQLException
> {
> if ( rs.next() )
> rs.close();
> }
>
> public static void main ( String[] args ) throws Exception
> {
> Statement stmt = null;
> ResultSet rs = stmt.executeQuery("select blalalala ");
> ClosedResultSet crs = new ClosedResultSet (rs);
> rs = ( ResultSet) java.lang.reflect.Proxy.newProxyInstance(
> rs.getClass().getClassLoader(),
> new Class[]{ResultSet.class}, crs );
>
> maMethodQuiPeutFermer(rs);
> if ( crs.isClosed() )
> {
> System.err.println("Oppps closed");
> } else
> {
> rs.close();
> }
> }
> }
>
>
>
>
>
> Laurent For�t
<[EMAIL PROTECTED] To: <[EMAIL PROTECTED]>
> com> cc: (bcc: Dominique
Gallot/BRU/MASTERCARD)
> Subject: Re: Resultset et
close()
> 07/03/2003 12:14
> Please respond to
> Laurent For�t
>
>
>
>
>
> Tout a fait exact, comme je travaille toujours sur une m�me base, j'avais
> omis ce d�tail.
>
> Pour la m�thode isClosed(), ca serait trop simple;) !
>
> Peut �tre faire la remarque � JCP pour qu'il modifie l'API JDBC.
>
> Laurent For�t.
>
> ----- Original Message -----
> From: "Erik Mazoyer" <[EMAIL PROTECTED]>
> To: "Laurent For�t" <[EMAIL PROTECTED]>
> Sent: Friday, March 07, 2003 11:54 AM
> Subject: RE: Resultset et close()
>
>
> > > ...puis regarder l'�galit� du message, en clair.
> >
> > Le probl�me est que ce message est d�pendant de la base de donn�e.
> > Je peux tr�s bien recevoir :
> > "The Resulset is closed"
> > ou
> > "L'ensemble des r�sultats est d�j� ferm�".
> >
> > Une analyse g�n�rique me semble impossible.
> >
> > Bref, j'ai bien l'impression qu'il n'y a pas de solution.
> > Ce serait pourtant si simple une m�thode :
> > public boolean isClosed() throws SQLException
> >
> > Merci,
> >
> > --------------------------------------------------------------------
> > Erik Mazoyer, Chef de projet
> > HyperOffice
> > 6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex
> > T�l. 01 41 96 96 76
> > Fax 01 41 96 96 77
> > M�l [EMAIL PROTECTED]
> >
> >
> > -----Message d'origine-----
> > De : Laurent For�t [mailto:[EMAIL PROTECTED]
> > Envoy� : vendredi 7 mars 2003 11:48
> > � : [EMAIL PROTECTED]
> > Objet : Re: Resultset et close()
> >
> >
> > Un truc affreux mais qui doit marcher est de rep�rer le message qui est
> > renvoy� par l'exception dans le cas o� le rs est d�ja fermer.
> > puis regarder l'�galiter du message, en clair :
> >
> > if(rs != null) {
> > try {
> > rs.close();
> > } catch(SQLException sqlex) {
> > if ( ! sqlEx.getMessage().equals("SQL already CLOSED)) {
> > throw sqlEx;
> > }
> > }
> >
> > laurent Foret.
> >
> > ----- Original Message -----
> > From: "Erik Mazoyer" <[EMAIL PROTECTED]>
> > To: <[EMAIL PROTECTED]>
> > Sent: Friday, March 07, 2003 11:33 AM
> > Subject: Resultset et close()
> >
> >
> > > J'ai une m�thode qui ouvre un java.sql.ResultSet sur une base de
> donn�e.
> > > Dans le finally de la m�thode, je referme le ResultSet (m�thode
> close()).
> > >
> > > ResultSet rs = null;
> > > try {
> > > ...
> > > rs = stmt.executeQuery(...);
> > > ...
> > > } finally {
> > > if(rs != null) {
> > > rs.close();
> > > }
> > > }
> > >
> > > Le probl�me est qu'au cours de la m�thode ce ResultSet peut �tre ferm�
> ou
> > non (la m�thode n'est pas en mesure de le savoir).
> > >
> > > Je n'ai pas trouv� de solution pour d�termin� si un ResultSet est
ferm�
> ou
> > non.
> > >
> > > Si je le ferme � nouveau le ResultSet dans le finally, une exception
> est
> > lev�e.
> > > Mais h�las elle est de type SQLException, ce qui n'est pas sp�cifique.
> > >
> > > Bref pour l'instant la seule solution trouv�e est de ne pas tenir
> compte
> > de l'exception lev�e par le close.
> > >
> > > } finally {
> > > if(rs != null) {
> > > try {
> > > rs.close();
> > > } catch(SQLException sqlex) {}
> > > }
> > > }
> > > Mais cela masque aussi toutes les autres raisons pour lesquelles le
> close
> > n'a pu avoir lieu, ce qui nuit au d�boguage.
> > >
> > > public void close()
> > > throws SQLException
> > > ...
> > > Throws:
> > > SQLException - if a database access error occurs
> > >
> > > Bref, avez vous une solution � me proposer ?
> > >
> > > Merci,
> > >
> > > --------------------------------------------------------------------
> > > Erik Mazoyer, Chef de projet
> > > HyperOffice
> > > 6, rue Jacques Daguerre - 92565 Rueil-Malmaison Cedex
> > > T�l. 01 41 96 96 76
> > > Fax 01 41 96 96 77
> > > M�l [EMAIL PROTECTED]
> > >
> >
> >
>
>
>
>
>
>
>
>
> **********************************************************************
> This email and any files transmitted with it are confidential and
> intended solely for the use of the individual or entity to whom they
> are addressed. If you have received this email in error please notify
> the system manager.
>
> This footnote also confirms that this email message has been swept by
> MIMEsweeper for the presence of computer viruses.
>
> www.mimesweeper.com
> **********************************************************************
>
>