IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

The result set is closed


Sujet :

JDBC Java

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut The result set is closed
    Bonjour tout le monde,

    Après m'être arraché les cheveux pour une erreur je viens vous demander un peu d'aide.

    Je travaille avec Firebirds 2.1 et une connection JDBC avec le driver Jaybirds 2.1.1.

    Lorsque je veux faire un insert massif dans une de mes tables, j'obtiens une erreur du type org.firebirdsql.jdbc.FBSQLException: The result set is closed. Je suis en train de me demander si c'est moi qui ai un problème pour faire un bete query ou bien si c'est firebird qui a un bug.

    Est-ce que quelqu'un peut me dire si il a déjà rencontré ce type de bug avec firebird ou bien si j'ai fai une erreur qq part dans ma fonction?

    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public BaremeInfDTO add(BaremeInfDTO entity) throws Exception {
    		Statement stmt = getConnection().createStatement();
    		ResultSet rs = stmt.executeQuery("SELECT NEXT VALUE FOR BINFGENERATOR FROM RDB$DATABASE");
     
    		if(rs.next()){/////<======CRASH ICI APRES QQ APPELS A LA FONCTION
    //			System.err.println(rs.getLong(1));
    			entity.setId(rs.getLong(1));
    		}else{
    			throw new Exception();
    		}
    		PreparedStatement pstmt = getConnection().prepareStatement("insert into BAREMEINF(ID,BEGDA,ENDDA,MODDA,ADDDA, BRUT,ISOLEMEN2REV,MEN1REV) values(?,?,?,?,?,?,?,?)");
    		pstmt.setLong(1, entity.getId());
            pstmt.setDate(2, entity.getBegda());
            pstmt.setDate(3, entity.getEndda());
            pstmt.setDate(4, entity.getModda());
            pstmt.setDate(5, entity.getAddda());
            pstmt.setDouble(6, entity.getBrut());
            pstmt.setDouble(7, entity.getIsoleMen2Rev());
            pstmt.setDouble(8, entity.getMen2Rev());
            Boolean ret = pstmt.execute();
     
            if(ret)
            	return entity;
            else
            	return null;
    	}

  2. #2
    Membre confirmé Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Points : 479
    Points
    479
    Par défaut
    Bonjour, je remontes ce sujet car j'ai exactement la même erreur (avec FB 1.5) et je n'arrive pas non plus à la résoudre.
    J'ai lu un peu partout qu'il fallait créer un statement pour chaque requête et que cela réglait souvent le problème. Le problème, c'est que c'est ce que je fais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public void afficherClientVille() {
    	String req = "SELECT id_client, nom_client FROM client";
     
    	try {
                    Statement stat = con.createStatement();
    		ResultSet res  = stat.executeQuery(req);
     
    		while(res.next()) {
    			String txt    = res.getString("nom_client");
                            int id_client = res.getInt("id_client");
                            System.out.println("Client " + txt + " :");
                            getNomVille(id_client);
    		}
    		stat.close();
    	} 
    	catch (SQLException e) {
    		System.err.println(e); 
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public String getNomVille(int id) {
    	String req = "SELECT V.nom " +
    		"FROM ville V " +
    		"INNER JOIN client_ville CV ON CV.id_ville = V.id_ville " +
    		"WHERE CV.id_client = "+id;
     
    	try {
                    Statement stat = con.createStatement();
    		ResultSet res    = stat.executeQuery(req);
     
    		while(res.next()) {
    			String txt = res.getString("nom");
                            System.out.println("- " + txt);
    		}
    		stat.close();
    	} 
    	catch (SQLException e) {
    		System.err.println(e); 
    	}
    }
    Ce que je fais :
    - une boucle pour afficher les noms des clients de la bdd.
    - on récupère l'id de chaque client.
    - une boucle pour afficher les noms des villes associées à l'id du client.

    Résultat : il ne m'affiche que le 1er client ainsi que la 1e ville qui lui est associé ainsi qu'un joli message : org.firebirdsql.jdbc.FBSQLException: The result set is closed

    Auriez-vous une idée ?

  3. #3
    Membre confirmé Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Points : 479
    Points
    479
    Par défaut
    Après quelques recherches, j'ai trouvé la solution. Il suffit simplement de désactiver l'auto-commit du Connection avant le premier statement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    con.setAutoCommit(false);
    et de rajouter un
    à la fin pour valider la transaction.

  4. #4
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Peut être que pour Firebird, l'option ResultSet.CLOSE_CURSORS_AT_COMMIT est utilisée par défaut ...

    De toutes façons, pour des raisons de performance, il est préférable de désactiver l'autocommit
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  5. #5
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    l'autoCommit est à true dans beaucoup de pilotes (tous ?) il est donc toujours préférable de préciser ce que l'on désire faire et de setter cette valeur soit meme.
    - Informaticien passionné
    - ( java, c++, cobol, php, asp, ... )
    - http://www.berthou.com/fr/

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/10/2010, 12h39
  2. result set is closed
    Par doc dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 12/09/2008, 13h44
  3. Réponses: 0
    Dernier message: 08/09/2008, 10h30
  4. JDBC: Result set already closed
    Par kidjeri dans le forum JDBC
    Réponses: 5
    Dernier message: 27/04/2006, 17h54
  5. procedures stockées:can't return a result set in the given..
    Par ronando dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 27/10/2005, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo