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

avec Java Discussion :

Relance du programme pour bon fonctionnement


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Points : 26
    Points
    26
    Par défaut Relance du programme pour bon fonctionnement
    Bonjour à tous,

    je suis en train de faire un petit programme qui sert à gérer le prêt du matériel informatique au sein d'un collège (un peu comme une médiathèque)
    J'ai prévu des méthodes pour créer des professeurs, des élèves, et des objets à emprunter, et mon souci est le suivant:
    - je lance la page d'accueil
    - je peux créer un professeur
    - je peux créer un élève
    - je peux créer un objet
    - si je veux créer un deuxième prof ou élève ou objet, cela ne marche pas, je suis obligé de tout fermer et de relancer le programme.
    Pourriez-vous me dire pourquoi, qu'est-ce qui ne va pas, afin que je puisse l'améliorer?
    Merci d'avance

  2. #2
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Là comme ça sans savoir la technos que tu utilise, la structure de ton application ça va être compliqué.
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Qu'est-ce je pourrais vous montrer pour être plus clair?
    J'ai oublié de préciser que je travaille avec une base de données MySQL. Au niveau de la connexion je n'ai pas de problème, c'est juste que je ne peux pas créer sur la base deux instances prof, élève ou matériel lors d'un lancement du programme. Le message d'erreur est le suivant:

    com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '700' for key 1

    c'est à dire, qu'il a créé un premier élève dont le numéro (primary key) est 700 (numéro obtenu avec la ligne
    numero = (int)(Math.random()*1000+1);
    de la classe "Eleve")
    et le deuxième porterait le même numéro?
    Des idées?

  4. #4
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    Comme ça, j'ai plus l'impression que c'est un problème SQL que Java. Ton message évoque une violation de contrainte sur ta base.

    Ton prog était probablement (mais je peut me tromper) en train de faire un INSERT INTO, avec une clef primaire (je pense) qui existe déjà dans la base. Comme cela viole la contrainte, MYSQL renvoi un refus, et JDBC lève une exception MySQLIntegrityConstraintViolationException.

    En l'occurence Duplicate entry '700', tu aurait déjà une clef primaire 700.

    Comment gère tu cela dans ta base ?

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Comme ça à froid, je dirais que de générer les clés primaires aléatoirement ce n'est vraiment pas une "good practice"...

    Une clé primaire est normalement générée par la base de données, c'est elle et elle seule qui s'occupe de gérer l'attribution des clés et non pas le programme client.... où alors, dans les rares cas où cela se justifie, le programme client doit tester qu'elle soit libre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int numero = (int)(Math.random()*1000+1);
     
    while(! db.sql("SELECT * FROM latable WHERE id = "+numero+"").isEmpty()) {
        numero = (int)(Math.random()*1000+1);
    }
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    et merci de vos réponses.
    La clé primarire est générée par le programme client, en effet. Pill_S, tu parles de faire créer cette clé par la base de données: comment faire cela?

  7. #7
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Ça dépend quelle base tu utilise. Tu peux par exemple utiliser une séquence sous Oracle. Tu peux aussi prendre le MAX de ta colonne + 1.
    autant l'hiver éclate que l'hétéroclite
    le vrai geek c'est celui qui croit qu'il y a 1024 mètres dans un kilomètre

  8. #8
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Il utilise MySQL.

    Pour la version 5 : AUTO_INCREMENT

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Merci visiwi, je vais regarder ça

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    grâce à vos précieux conseils j'ai réussi à mettre en place un identifiant généré par la base de données et je peux créer autant de profs, élèves, que je veux. Un grand merci

    Je profite pour poser une question en rapport avec l'affichage des profs. J'ai utilisé getGeneratedKeys() pour obtenir la clé générée, mais en fait, tout est correctement affiché , que j'utilise ou pas cette fonction
    Quelqu'un saurait-il me dire pourquoi?
    Voici le code:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
     
        public static void Insert() throws SQLException
        {
            String nom = ProfFrame.saisirNom.getText().trim();
            String prenom = ProfFrame.saisirPrenom.getText().trim();
            String matiere = ProfFrame.smat.getSelectedItem().toString();
            int emp = p.getNbEmprunts();
     
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost/emprunts", "root", "sa@admin");
                ps = con.prepareStatement("INSERT INTO professeurs (Nom, Prénom, Matière, Nombre_Emprunts) VALUES (?,?,?,?)");
                ps.setString(1, nom);
                ps.setString(2,prenom);
                ps.setString(3,matiere);
                ps.setInt(4,emp);
                ps.execute();
     
                /*ResultSet rs = ps.getGeneratedKeys();
                if (rs.next())
                {
                    p.ID = rs.getInt(1);
                }*/
     
                con.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
       }
     
        public static ArrayList<Professeur> List() throws Exception
        {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost/emprunts", "root", "sa@admin");
            ps = con.prepareStatement("SELECT * FROM professeurs");
            ResultSet rs = ps.executeQuery();
            ArrayList<Professeur> liste = new ArrayList<Professeur>();
            while (rs.next())
            {
                p = _readProf(rs);
                liste.add(p);
            }
            con.close();
            return liste;
            }
     
     
        public static Professeur _readProf(ResultSet rs) throws SQLException
        {
            int id = rs.getInt("ID");
            String nom = rs.getString("Nom");
            String prenom = rs.getString("Prénom");
            String matiere = rs.getString("Matière");
            int nbEmp = rs.getInt("Nombre_Emprunts");
            Professeur p = new Professeur();
            p.setID(id);
            p.setNom(nom);
            p.setPrenom(prenom);
            p.setMatiere(matiere);
            p.setNbEmprunts(nbEmp);
            return p;   
        }
    }

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    je poste un deuxième message, en espérant que vous pourrez m'aider à comprendre mon erreur.
    J'arrive à afficher à partir de la base MySQL la liste de professeurs et d'élèves correctement. Par contre, en ce qui concerne le matériel, j'arrive à créer, supprimer, mettre à jour sans problème. Le souci se présente à l'affichage: l'identifiant s'affiche correctement, mais après je n'obtiens que le type, la marque et le modèle du dernier objet sur la table; si j'ai trois objets, j'obtiens les identifiants 1,2,3 mais le type du dernier objet répété trois fois, et même chose pour la marque et le modèle. Voici la classe dont je pense provient le problème:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    public class MaterielFactory
    {
        static Connection con = null;
        static PreparedStatement ps = null;
        static Materiel m = new Materiel();
     
        public static void Insert()
        {
            String type = MaterielFrame.styp.getSelectedItem().toString();
            String marque = MaterielFrame.saisirMarque.getText().trim();
            String modele = MaterielFrame.saisirModele.getText().trim();
     
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost/emprunts", "root", "sa@admin");
                ps = con.prepareStatement("INSERT INTO materiel (Type, Marque, Modele) VALUES (?,?,?)");
                ps.setString(1, type);
                ps.setString(2,marque);
                ps.setString(3,modele);
                ps.execute();
                con.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
     
        public Materiel Select(int id)
        {
            Materiel retValue = null;
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost/emprunts", "root", "sa@admin");
                ps = con.prepareStatement("SELECT * FROM materiel WHERE ID=?");
                ps.setInt(1, id);
                ResultSet res = ps.executeQuery();
                if(res.next())
                {
                    retValue = _readMat(res);
                }
                con.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            return retValue;
        }
     
        public static void Delete()
        {
     
            int iidd = Integer.parseInt(MaterielFrame.saisirNum.getText().trim());
     
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost/emprunts", "root", "sa@admin");
                ps = con.prepareStatement("DELETE FROM materiel WHERE ID=?");
                ps.setInt(1,iidd);
                ps.execute();
                con.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
     
        public static void Update()
        {
            String type = MaterielFrame.styp.getSelectedItem().toString();
            String marque = MaterielFrame.saisirMarque.getText().trim();
            String modele = MaterielFrame.saisirModele.getText().trim();
            int id = Integer.parseInt(MaterielFrame.saisirNum.getText().trim());
     
            try
            {
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection("jdbc:mysql://localhost/emprunts", "root", "sa@admin");
                ps = con.prepareStatement("UPDATE materiel SET Type=?, Marque=?, Modele=? WHERE ID=?");
                ps.setString(1,type);
                ps.setString(2,marque);
                ps.setString(3, modele);
                ps.setInt(4, id);
                ps.execute();
                con.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
     
        public static ArrayList<Materiel> List() throws Exception
        {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost/emprunts", "root", "sa@admin");
            ps = con.prepareStatement("SELECT * FROM materiel");
            ResultSet rs = ps.executeQuery();
            ArrayList<Materiel> liste = new ArrayList<Materiel>();
            while (rs.next())
            {
                m = _readMat(rs);
                liste.add(m);
            }
            con.close();
            return liste;
            }
     
        public static Materiel _readMat(ResultSet rs) throws SQLException
        {
            int id = rs.getInt("ID");
            String type = rs.getString("Type");
            String marque = rs.getString("Marque");
            String modele = rs.getString("Modele");
            Materiel materiel = new Materiel();
            materiel.setID(id);
            materiel.setType(type);
            materiel.setMarque(marque);
            materiel.setModele(modele);
            return materiel;
        }
    }

  12. #12
    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
    Bonjour,

    juste en passant, pense à fermer correctement tes connexions et autres objets liés à la base. C'est à dire dans des blocs try/finally. Cf Comment libérer proprement les ressources (ou comment utiliser proprement les bloc try/finally) ?

    Sinon pour ton problème d'affichage, je te conseilles d'utiliser le mode debuggage de ton IDE.
    "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/

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Merci pour le conseil in.
    En ce qui concerne le debuggage, je n'ai pas d'erreurs dans la classe, c'est pour ça que je ne sais pas ce que j'ai mal fait.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    j'ai enfin trouvé le problème: des varables et méthodes static dans une autre classe qui empêchaient le bon affichage.
    Merci à vous tous pour vos conseils et votre aide.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/02/2014, 01h26
  2. Concours de programmation pour trouver un (bon) job
    Par Aude_B dans le forum Emploi
    Réponses: 2
    Dernier message: 16/10/2012, 14h53
  3. Réponses: 0
    Dernier message: 01/07/2010, 11h39
  4. champs de bits dans une structure - option de gcc pour bon fonctionnement
    Par matdakillah dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 08/10/2008, 12h44

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