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 :

[Logique] boucle infernale pour gestion manuelle de PK


Sujet :

JDBC Java

  1. #1
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut [Logique] boucle infernale pour gestion manuelle de PK
    bonsoir a tous !

    voila, je veux realiser une boucle depuis quelque heures, j'ai tout essaye et je deviens fou, je sais c'est stupide mais j'arrive plus a voir mes erreurs, vous voulez bien jeter un pt'it coup d'oeil ?

    je vous explique le principe, ca se passe dans la fonction create d'un DAO qui ajoute donc un objet client dans la table du meme nom, ca doit gerer l'attribution de key en lieu et place de mysql c'est a dire :
    si vide commencer a zero
    si key sont contigües alors donner le dernier numero + 1
    si trou (du a des delete) alors completer dabord les trou

    voila mon 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
     
    Integer key = info.getIdclient();
    		int firstid= -1;
     
    		try {
    			c = getConnection();
    			//code a valider si gestion manuelle de la PK 
    			//version 1: delegation auto_incremente a MySQL
     
    			if (key == null){
     
    					ps2 = c.prepareStatement(FIND_ALL_ID);
    					rs = ps2.executeQuery();
     
    					if (!(rs.next())){
    						//cas ou le resulset est vide | cad premier enregistrement
    						System.out.println("Le resultset est vide");
    						firstid=0;
     
    					}else{//autre cas | rs rows >=1 
    						int i,j;
    						i=j=1;
    						firstid=1;
    						System.out.println("la valeur initiale de i est : " + i);
    						System.out.println("l'indice initiale du resultset est : " + rs.getRow());
    						for(i=rs.getInt(1), j=1 ; rs.next() ; j++){
     
    							System.out.println("la valeur de i est : " + i);
    							System.out.println("la valeur de j est : " + j);	
    							if ((i-j)>0){
    								firstid = j;
    								break;
    							}else{
    								firstid = i + 1;
    							}
    						}
    					}
    					System.out.println("la valeur de firstid est : " + firstid);
    					info.setIdclient(new Integer(firstid));
    			}else {	
    				//cas si l'objet client passe en param force une valeur d'ID au risque de lever une exception
    				if (!rs.next()) {
    					throw new clientDAOSysException("The sequence ID does not exist");
    				}
    			}
    //a partir de la la fonction create fonctionne parfaitement


    et voila le message d'une fonction main
    Cette Fonction creer un nouveau client dans la base
    Le resultset est vide
    la valeur de firstid est : 0
    un nouveau client a ete crer dans la base, il porte l'ID 0

    Saisissez un nombre ; tapez 0 pour quitter
    Cette Fonction creer un nouveau client dans la base
    la valeur initiale de i est : 1
    l'indice initiale du resultset est : 1
    la valeur de firstid est : 1
    un nouveau client a ete crer dans la base, il porte l'ID 1

    Saisissez un nombre ; tapez 0 pour quitter
    Cette Fonction creer un nouveau client dans la base
    la valeur initiale de i est : 1
    l'indice initiale du resultset est : 1
    la valeur de i est : 0
    la valeur de j est : 0
    la valeur de firstid est : 1
    sun.cne.msp.client.exception.clientDAOSysException: SQLException : java.sql.SQLException: Duplicate entry '1' for key 1
    at sun.cne.msp.client.DAO.MySQLclientDAO.create(MySQLclientDAO.java:258)
    at sun.cne.msp.Start.main(Start.java:87)
    alors bien sur j'ai compris que la clef est attribue deux fois mais quand c'est pas la 1 c'est la deux y'a toujours un moment ou ca plante

    Moi je vois vraiment plus, please help !!!

    WDIO
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  2. #2
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut
    comme vous le voyez au 3eme appel i et j sont a 0, et je comprends pas pourquoi parce que la boucle commence a 1 ????

    c'est sur j'ai fait une faute mais lorsque je change un endroit ca plante ailleur

    WD
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  3. #3
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i=j=1; 
    firstid=1;
     
    for(i=rs.getInt(1), j=1 ; rs.next() ; j++){ ***
    A la ligne marquée *** tu écrases la valeur de i (initialisé à 1) par rs.getInt(1).

  4. #4
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut
    oui, desole j'ai du quitte mon ecran pour ne pas devenir fou !

    Citation Envoyé par herve91
    A la ligne marquée *** tu écrases la valeur de i (initialisé à 1) par rs.getInt(1).
    eh bien en fait, ce que je souhaiterai c'est que i recupere la valeur stocke dans rs.getInt(1) cad les numero de clef dans la base

    et que j s'incremente normalement

    c'est sur la difference entre j et i que j'espere detecter un trou de sequence (du a un delete s'il en existe) et ainsi donner d'abord une clef primaire issue d'un trou avant d'incrementer la derniere clef

    wdio !
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    Dans ces cas la je te conseil de bien reprendre au calme l'algorithme sur papier, et de le refaire depuis zero tranquillement

    Sinon la flemme de matter le code je matterai demain si j'ai le temps

  6. #6
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut EUREKA !!!! :D
    et bien je n'y croyais plus mais ca marche (ca boucle plutot) !!

    ayant lance le debat, je le clo en apportant la solution, bien sur que la faute etait idiote, ca ne pouvait qu'etre, ce qui est encore plus rageant apres qq heures passe a la chercher!

    Alors voila, comme c'est la mode de faire des boucle for a deux indices, j'avoue que cela m'a parue evident et que jamais cela ne m'etais venu de remettre en cause ce point ---> c'est pourtant le cas ici car en placant i dans la boucle et non dans l'entete du for, la fonction joue parfaitement son role.

    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
     
    		Integer key = info.getIdclient();
    		int firstid= -1;
     
    		try {
    			c = getConnection();
    			//code pour une gestion manuelle de la PK  sur la DB
     
    			if (key == null){
    			        ps2 = c.prepareStatement(FIND_ALL_ID);
    				rs = ps2.executeQuery();
    						if (!(rs.next())){
    						//cas ou le resulset est vide 
    						System.out.println("Le resultset est vide"); //DEBUG ONLY
    						firstid=0;
     
    					}else{//autre cas | rs rows >=1 
    						int i,j;
    						j=i=firstid=1; //initialisation a 1
    						System.out.println("la valeur initiale de i est : " + i);//DEBUG ONLY
    						System.out.println("l'indice initiale du resultset est : " + rs.getRow());//DEBUG ONLY
    						for(j=1 ; rs.next() ; j++){
                                                    //determine s'il existe des trous dans la sequence de clef
    							i=rs.getInt(1);							
    							System.out.println("la valeur de i est : " + i);//DEBUG ONLY
    							System.out.println("la valeur de j est : " + j);//DEBUG ONLY	
    							if ((i-j)>0){
    								firstid = j;
    								break;
    							}else{
    								firstid = i + 1;
    							}
    						}
    					}
    					System.out.println("la valeur de firstid est : " + firstid);//DEBUG ONLY
    					info.setIdclient(new Integer(firstid));
                                            //insertion de la clef dans l'objet client a inserer (passe en param de la fonction)
    			}else {	
    			//cas particulier si l'objet client passe en param force une valeur d'ID au risque de lever une exception
    				if (!rs.next()) {
    					throw new clientDAOSysException("The sequence ID does not exist");
    				}
    			}
    eh ben voila, je copie le code s'il peut servir a d'autre, notament souhaitant gerer manuellement les PK sur une Mysql avec J/connector comme JDBC. MySQL ne disposant pas de fonction de recherche de clef contrairement par exemple a postgres (nextval())

    merci quand meme a vous deux ! un p'tit resolu et au dodo

    WDionysos

    PS: maintenant que je depasser le quota de longueur de message, si quelqu'un a une idee d'optimisation ou de simplification je suis preneur,
    (pour la beaute du code)
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  7. #7
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Au risque de poster n'importe quoi, ta boucle me semblait trop compliquée, et j'ai relevé de défi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ...
    if(key == null) {
      ps2 = c.prepareStatement(FIND_ALL_ID);
      rs = ps2.executeQuery();
     
      // les hostilités commencent
      int i = 1;
      while( rs.next() && rs.getInt(1) == i ) i ++;
      firstid = i;
      // les hostilités sont finies.
     
      info.setIdclient(new Integer(firstid));
    } else {
    ...
    Ca m'embete de faire tenir tout ton code sur 3 lignes (2 si tu utilises un for), et je dois avoir zappé quelque chose.
    Je tente quand meme car, pour ma part, quand je surchauffe, ca m'arrive de ne plus savoir faire une boucle.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  8. #8
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut
    eh bien je n'ai qu'un seul mot a dire :

    BRAVO !!!

    ca marche comme ca effectivement
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  9. #9
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut
    comme il a penurie de gaz russe si vous en manquez demandez moi je produit des usines (quand je peux utiliser une bouteille.

    Bon c'est vrai je suis jamais alaise avec des double condition mais un && dans une boucle while (qui a ete ma premiere idee mais sans double condition) fonctionne parfaitement.

    Si je comprend bien i s'incremente soit jusqu'a la fin du resultset s'il n'y a pas de trous rs.next() soit jusqu'un trou est trouve cad où rs.get(I) est different de i

    encore bravo ! c'est vrai que ca me parait evident et que hier je devais vraiment etre en surchauffe, ce qui m'a fait derive je pense c'est que je voulait a tous pris utiliser un maximum de methode du resultset (qui n'en manque pas) et que j'ai ete surpris qu'il n'y a en aucune capable directement de renvoyer un numero de row corespondant a un trou de sequence dans le resultset . ce qui serait for pratique.

    WDionysos
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  10. #10
    Membre habitué Avatar de wdionysos
    Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2003
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 222
    Points : 189
    Points
    189
    Par défaut résigné !! :D
    bon voila j'ai donc opte pour ta solution nettement plus propre et plus simple
    et en ai profiter pour rajouter une petite verif si une clef (forcee dc differend de null) est passe afin de m'assurer que celle ci ne soit pas deja attribuer, c'est la 2eme partie (else). ceci permet que le dao puisse deleguer a une couche superieur la gestion de clef (notament pour des phase de debug.

    comme ca je pense qu'on a un ex complet de gestion de clef manuelle en java pour Mysql

    merci xavlours !

    WD
    Je ne voudrais pas faire partie d'un club qui voudrait m'avoir moi pour membre.... [Grouchot Marx]
    Mais en tant que Marxiste, je playdoye pour le travail communautaire. C'est un paradoxe olympien ! Comprend qui peut !!!

  11. #11
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    De rien, moi aussi je suis passé par là, à réduire des classes codées entre 5 et 9 h du soir en 100 lignes chacune à 2 fois moins de classes de 40 lignes après un weekend au vert (et parfois, de 50 à 2 lignes en lisant la javadoc )
    Ca fait mal de se dire qu'on a résolu un algo bien complexe pour se rendre compte que bof, c'était pas si terrible.

    Enfin, ravi d'avoir pu te rendre service.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

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

Discussions similaires

  1. [XL-2010] VBA pour gestion de boucle
    Par yeahna dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 13/09/2012, 09h00
  2. Controle pour gestion / recherche de dossiers...
    Par Spike Spiegel dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 13/11/2005, 12h48
  3. [JMeter] Problème avec la boucle infinie pour les tests
    Par zegreg dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/10/2005, 11h41
  4. Réponses: 22
    Dernier message: 25/08/2005, 16h03
  5. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14

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