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

Java Discussion :

Delete une table MySql avec les résultats d'un ResultSet


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut Delete une table MySql avec les résultats d'un ResultSet
    Hello !

    Je viens d'écrire une fonction qui supprime tous les champs sélectionner d'une table Mysql, mais j'ai une erreur sur la suppression :

    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
    public static void cleanDatabase() throws Exception
    {
            Connection conn = getConnection();
            Statement stmt = conn.createStatement();
            try {
     
                ResultSet rs = stmt.executeQuery("SELECT * FROM MaTable WHERE MonChamp='critere'");
                while (rs.next()) {
                      stmt.executeUpdate("DELETE FROM MaTable WHERE MonChamp = '"+rs.getString("MonChamp")+"'");
                    }
                }
     
            } catch(SQLException e) {
                e.printStackTrace();
            } 
            stmt.close();
            conn.close();
    }
    Normalement ce code devrait bien supprimer toute les lignes ramenées par ma requête, mais voici ce que la console me renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: Operation not allowed after ResultSet closed
    Pourtant je n'ai pas fermé mon resultset...

  2. #2
    Membre confirmé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 158
    Points : 556
    Points
    556
    Par défaut
    C'est parce que tu ré-utilises le même Statement.
    Citation Envoyé par Javadoc
    A ResultSet object is automatically closed when the Statement object that generated it is closed, re-executed, or used to retrieve the next result from a sequence of multiple results.
    Une réponse vous a aidé ? Votez pour !
    Vous n'avez plus de problème ? N'oubliez pas de le signaler !

  3. #3
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Et puis accessoirement ce que tu cherches à faire est jouable en une seule requête surtout...


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    delete from MaTable where monchamp='critere';

    Ou si tu as deux tables:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    delete from MaTable1 where monchamp1 in (select monchamp2 from MaTable2 where monchamp3='critere')
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    Oui c'est sûr mais je voudrais faire certains tests avant de supprimer. Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ResultSet rs = stmt.executeQuery("SELECT * FROM MaTable WHERE MonChamp='critere'");
    while (rs.next()) {
             if(rs.getString("MonChamp")= monTest) {
                      stmt.executeUpdate("DELETE FROM MaTable WHERE MonChamp = '"+rs.getString("MonChamp")+"'");
             }
    }
    Je veux juste savoir ce qui pose problème dans le delete...

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par BobbyWeb Voir le message
    Oui c'est sûr mais je voudrais faire certains tests avant de supprimer. Du genre :
    Heu... Là tu revérifies la même chose...
    Il y a de très forte chance que tu puisses faire cela via du SQL, ce qui serait surement bien plus performant.


    Citation Envoyé par BobbyWeb Voir le message
    Je veux juste savoir ce qui pose problème dans le delete...
    Ben cela a été dit : Le fait d'exécuter une requête sur le même Statement ferme ton ResultSet...

    Donc il faut soit utiliser un autre Statement, soit utiliser un ResultSet "updatable" et d'utiliser la méthode deleteRow()


    a++

    PS : Et au passage, préfères aussi l'utilisation de PreparedStatement à la place de concaténation de chaines qui peuvent entrainer des bugs voir des failles (SQL injection)

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 81
    Points : 36
    Points
    36
    Par défaut
    c'est parfait adiGuba : je créer un PreparedStatementdans mon While et je l’exécute à la fin, la j'ai plus d'erreur et ça fonctionne correctement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/04/2009, 15h38
  2. [MySQL] Mettre à jour une table mysql avec un fichier xml ou csv
    Par pasbonte dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/02/2009, 08h56
  3. Réponses: 2
    Dernier message: 09/11/2006, 09h59
  4. Effacer une table mysql tout les...
    Par Invité dans le forum Requêtes
    Réponses: 5
    Dernier message: 31/03/2006, 10h09
  5. Es-ce possible de créer une table MySQL avec MS Excel
    Par pierrot10 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/10/2005, 06h30

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