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 :

Problème de manipulation de bases de données


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 10
    Points
    10
    Par défaut Problème de manipulation de bases de données
    Bonjour,

    Je me permets de vous solliciter pour vous faire part d'un problème que je rencontre dans mon projet Java actuel.

    Mon problème est le suivante :
    Dans un "JList" j'affiche toutes les valeurs d'une table de ma base de données MySQL. Jusque ici, pas de soucis.
    Ensuite, je souhaite sélectionner une ligne et insérer quatre champs de cette ligne précédente vers une nouvelle table. Je peux sélectionner une ligne, et mon "println" me renvoie bien la bonne ligne en totalité, mais lors de l'insertion, il ne rentre que les valeurs de la dernière ligne.

    Je précise que j'utilise le code suivant :

    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
     
     try{
    				/* Connexion à la base données pour la connexion de l'utilisateur*/
    				Class.forName("com.mysql.jdbc.Driver");
    				Connection con=DriverManager.getConnection("jdbc:mysql://localhost/XXXX","root","");
    				String queryString = "SELECT Ref, Type, Genre, Titre, Auteur, Prix, Quantite FROM produits";  //Séléctionne tous les champs de ma table
    				Statement stm=con.createStatement();
    				ResultSet result = stm.executeQuery(queryString);
     
    				while(result.next()){	
    				ref = result.getString("Ref");
    				type = result.getString("Type");
    				genre = result.getString("Genre");
    				titre = result.getString("Titre");
    				auteur = result.getString("Auteur");
    				prix = result.getString("Prix");
    				quantite = result.getString("Quantite");
    				listModel.addElement(ref+"     |     "+type+"     |     "+genre+"     |     "+titre+"     |     "+auteur+"     |     "+prix+"     |     "+quantite+"\n"); //affiche toutes les valeurs dans le DefaultListModel
     
    				}
     
    				con.close(); 
    			}catch (Exception a) {
    				System.out.println("ERROR :"+a.getMessage());	
     
    			}
    }
    	public void actionPerformed(ActionEvent e){
    		if(e.getActionCommand().equals(AJOUTER)){ //lorsqu'on appuie sur le bouton "ajouter"
    			if(list.getSelectedIndex() > -1){ //selection de la ligne voulue
    					int c = listModel.size() ; //Compte le nombre d'élément dans la JList
    					for (int i=0;i<c;i++)
    					{
    						if (list.isSelectedIndex(i)) // si l'élément est sélectionné alors...
    						{
    							try
    							{
    								System.out.println("Valeur de la selection " + listModel.get(i)); //renvoie la valeur de la ligne séléctionné
    								String nom = JOptionPane.showInputDialog(fenetre, "Entrez votre nom : (le même que lorsque vous vous etes inscrit)");
    								String qte = JOptionPane.showInputDialog(fenetre, "Entrez la quantité que vous en voulez :");
    								Connection con1 = DriverManager.getConnection("jdbc:mysql://localhost/XXXXX","root","");
    								Statement stm = con1.createStatement();
    								stm.executeUpdate("INSERT INTO `panier`(`Nom_client`,`Ref_article`,`type`,`titre`,`quantite`,`prix`)" +
    				" VALUES('"+nom+ "','" +ref+ "','" +type+ "','"+titre+"','" +qte+ "','" +prix+ "')");  //requete qui insère les valeurs dans une nouvelle table
    								JOptionPane.showMessageDialog(fenetre,"Vous venez d'ajouter le "+type+" : "+titre+" à votre panier");
    								System.out.println("classe choix produit :"+ref+" "+pNom+" "+qte); 
     
    							} 
    							catch (Exception a) {
    								System.out.println("ERROR3 :"+a.getMessage());	
     
    							}
     
    				}
    			}
    		}
     
    		}
    Comment puis-je résoudre ce problème ?
    En vous remerciant par avance.
    Simon

  2. #2
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    A priori je dirais que ta variable ref reste toujours initialisé avec la dernière valeur du select. Il faudrait lui assigner la valeur de la référence de l’élément sélectionner dans ton Jlist.

  3. #3
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    Utilises des variables locales plutôt que des variables globales.

    Quelques conseils :
    • Fournis une classe complète plutôt que des fragments dont on ne sait pas à quoi ils correspondent. Surtout qu'il manque la déclaration de la plupart des variables.
    • Committes explicitement après avoir terminé une transaction.
    • Pas la peine de faire Class.forName() à chaque fois fais le au début de ton programme ou bien utilises la propriété système "jdbc.drivers"
    • Regroupes la gestion de JDBC (Connection, Statement, etc) dans une classe dédiée.
    • Utilises des PreparedStatement quand tu utilises des paramètres dynamiques
    • Fermes ton ResultSet et ta Connection quand tu n'en a plus besoin.
    • Quand tu parcours les éléments sélectionnés, va du plus petit index jusqu'au plus grand inclu
    • Pour afficher un élément dans une liste, il est préférable de mettre un objet Java dans le modèle et d'utiliser un renderer pour spécifier le rendu. Par défaut le renderer utilise la méthode toString.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup pour vos réponses à tous les deux. Je vais essayer de corriger tous ces points.

    Citation Envoyé par NicoL__ Voir le message
    A priori je dirais que ta variable ref reste toujours initialisé avec la dernière valeur du select. Il faudrait lui assigner la valeur de la référence de l’élément sélectionner dans ton Jlist.
    Quelle méthode utiliser ? En effet, toString et getText ne fonctionnent pas.
    Je ne sais pas laquelle utiliser.

    Cordialement.

  5. #5
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    int getSelectedIndex() te permet de récupérer l'index sélectionner après il faut faire le rapprochement avec ta source de données ton ListModel ou getSelectedValue()

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci pour vos réponses.

    Je test la récupération de données avec des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(list.getSelectedValue())
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(list.getSelectedIndex())
    .
    Il me renvoie bien les valeurs que je séléctionne.

    Après je test la valeur renvoyée avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(list.isSelectedIndex(list.getSelectedIndex())){	
    stm.executeUpdate("INSERT INTO `panier`(`Nom_client`,`Ref_article`,`type`,`titre`,`quantite`,`prix`)" +" VALUES('"+pNom+ "
    ','" +ref+ "','" +type+ "','"+titre+"','" +qte+ "','" +prix+ "')");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JOptionPane.showMessageDialog(fenetre,"Vous venez d'ajouter le "+type+" : "+titre+" à votre panier");
    Donc normalement, il devrait insérer la valeur que j'ai sélectionné ; hors il rajoute toujours la dernière valeur de ma table.

    Comment dois-je faire pour résoudre ce problème ?

  7. #7
    Membre confirmé Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Points : 577
    Points
    577
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(list.isSelectedIndex(list.getSelectedIndex())){	
    stm.executeUpdate("INSERT INTO `panier`(`Nom_client`,`Ref_article`,`type`,`titre`,`quantite`,`prix`)" +" VALUES('"+pNom+ "
    ','" +ref+ "','" +type+ "','"+titre+"','" +qte+ "','" +prix+ "')");
    Le problème c'est l'initialisation de valeur des variables ref - type- titre -qte -prix
    Dans ton model tu ajoutes un élément ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listModel.addElement(ref+"     |     "+type+"     |     "+genre+"     |     "+titre+"     |     "+auteur+"     |     "+prix+"     |     "+quantite+"\n")
    C'est pas terrible...

    list.getSelectedValue() te renverra la valeur sélectionnée donc une string de la concaténation des élément précédents.

    Soit tu parse cette string pour récupérer les éléments qui t'interesse avec un split par exemple.

    Soit tu reprends tout et tu crées une class (MonElement) avec les propriété ref type genre... que tu ajoutes dans le listModel.
    Et ça donnera :

    ((MonElement)list.getSelectedValue()).getRef() pour récupérer la référence de l'objet selectionné.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 10
    Points
    10
    Par défaut
    Merci pour la réponse. J'espère qu'elle m'aidera. Cela ne fonctionne toujours pas malheureusement.

    De plus, le code ci-dessous ne fonctionne pas non plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Produit) list.getSelectedValue()).getRef();

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Points : 10
    Points
    10
    Par défaut java
    En cherchant toute la soirée, j'ai pu régler mon problème d'affichage, cependant lorsque j'effectue le code que vous m'avez donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Produit)list.getSelectedValue()).getRef();
    J'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.String cannot be cast to Produit.Produit
    En effet, j'ai créé la classe Produit qui va chercher les valeurs de ma table, elle les affichent bien, après je sélectionne la valeur que je veux insérer dans la nouvelle table mais la apparaît l'erreur. Je ne fait aucun "if.." comme dans mes messages précédents. Je ne sais plus du tout comment faire.

    En vous remerciant.

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

Discussions similaires

  1. [ACCESS] - Problème d'ouverture de base de données...
    Par fredhali2000 dans le forum Access
    Réponses: 21
    Dernier message: 21/02/2006, 10h10
  2. [MySQL] Un problème d'appel de base de donnée!
    Par dp33 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 05/02/2006, 21h54
  3. Peut-on manipuler une base de donnée oracle sans oracle
    Par sillycoder dans le forum Oracle
    Réponses: 8
    Dernier message: 19/01/2006, 09h00
  4. [phpMyAdmin] problème pour exporter ma base de données
    Par Chezbebsi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 04/12/2005, 11h58
  5. Problème de sauvegarde de bases de données
    Par Gwipi dans le forum Administration
    Réponses: 2
    Dernier message: 09/09/2005, 08h30

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