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 :

problème avec la clè étrangère (java netbens et mysql)


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 18
    Par défaut problème avec la clè étrangère (java netbens et mysql)
    J'ai un problème de requête SQL:

    Par exemple, j'ai 2 tables dans la base produit(num, nom,idCatégorie#)
    et catégorie(idCatégorie, libellé_catégorie).
    Dans l'interface graphique, j'ai un jTable et un bouton "ajouter" qui va insérer les données de jTable dans la table produit. Les colonnes de jTable sont : NumProduit, NomProduit, CatégorieProduit.

    Le problème, c'est que, dans la colonne CatégorieProduit, je dois saisir le libellé de la Catégorie du produit. Mais dans la base, la table produit ne contient pas libellé produit, il contient IdCatégorie

    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
    //récuperer le champs catégorieProduit
    int a=jTable1.getSelectedRow();
     
           Object CatPro=jTable1.getModel().getValueAt(a,0);
             System.out.println("la valeur de '"+a+" et 0' ="+CatPro);
    //pour la base de données
     try{
     
          Class.forName("com.mysql.jdbc.Driver");
          Connection con=NULL;
          con =       (Connection) DriverManager.getConnection( "jdbc:mysql://localhost:3306/mabase?user=root&password=");
          Statement st=(Statement) con.createStatement();
     
          ResultSet rs = st.executeQuery("SELECT idCatégorie from  catégorie WHERE Libellé_Catégorie = "+CatPro);
     
           st.executeUpdate("insert into Produit values('"+num+"','"+nom+"','"+CatPro+"')");
     
           }catch(Exception e)
               {System.out.println(e.toString());
                System.out.println("EXCEPTION !!!!");
                 }

    Une exception est déclenchée :

    la valeur de '0 et 2' = Catégorie X1

    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'catégorie X1' in 'where clause'

    BUILD SUCCESSFUL (total time: 4 minutes 16 seconds)

    Donc je n'arrive pas à insérer les données saisies

    un coup de main SVP

    Merci d'avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Il faut que tu mettes ta variable entre simples cotes et que ta requete su termine par un ; :
    ResultSet rs = st.executeQuery("SELECT idCatégorie from catégorie WHERE Libellé_Catégorie = '"+CatPro)+"';";

    tu devrais essayer d'imprimer ta requête dans la console pour mieux voir

  3. #3
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 18
    Par défaut
    Bonsoir

    il m'affiche incompatible type

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 36
    Par défaut
    Bonjour zéro_un,

    Je ne sais pas d'où viennent tes données, mais ce genre de code contient en germe tout le nécessaire pour une attaque par injection de SQL:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           st.executeUpdate("insert into Produit values('"+num+"','"+nom+"','"+CatPro+"')");
    Le risque est peut-être inexistant dans ton application (?), mais en tous cas, c'est une mauvaise habitude.

    Dans le cas général, je te conseille d'utiliser systématiquement des requêtes préparées. Ici, j'illustre sur ta requête INSERT, mais c'est valable pour n'importe quelle requête SQL (INSERT, SELECT, etc.):
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PreparedStatement ps = com.prepareStatement("insert into Produit values(?, ?, ?')");
    ps.setInt(1, num);
    ps.setString(2,nom);
    ps.setInt(3,CatPro);
    ps.executeUpdate();
    Accessoirement, ca rend les requêtes plus lisibles dans le code. Et ça met en avant le type attendu pour les différentes valeurs. Par exemple, je vois que le troisième paramètre devrait être un entier. Or est-ce que c'est vraiment le cas de CatPro? J'en doute car d'après le reste de ton code, je suppose que c'est plutôt le nom de ta catgorie que son id


    Ainsi, concernant ta question, je pense que ton problème est que tu interroges la table idCatégorie pour demander l'ID de la catégorie de nom CatPro (SELECT ...). Mais que tu ne récupères jamais le résultat de cette requête. Il te manque quelque-chose de la forme:
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          ResultSet rs = st.executeQuery("SELECT idCatégorie from  catégorie WHERE Libellé_Catégorie = "+CatPro);
    if (!rs.next())
        throw ExceptionCategoryInconnue(); // ou n'importe quelle autre gestion d'exception
    int CatId = rs.getInt(1);

    A la place, je pense que tu pourrais aussi avec MySQL utiliser des requêtes imbriquées. Quelque-chose de la forme suivante devrait pouvoir faire l'affaire:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO Produit VALUES(?, ?, (SELECT idCatégorie FROM  catégorie WHERE Libellé_Catégorie = ?))

    Cordialement,
    - Sylvain

  5. #5
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 18
    Par défaut
    Merci Sylvain ca marche bien
    ( requêtes imbriqués )

Discussions similaires

  1. problème avec un code source JAVA
    Par magicbisous-nours dans le forum SQL
    Réponses: 7
    Dernier message: 10/12/2007, 17h09
  2. Problème avec les clés étrangères
    Par PoichOU dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 06/11/2007, 09h46
  3. Problème avec les méthodes en JAVA
    Par beegees dans le forum Langage
    Réponses: 9
    Dernier message: 04/02/2007, 20h19
  4. Problème avec l'installation de java
    Par jab dans le forum Windows Vista
    Réponses: 1
    Dernier message: 05/01/2007, 17h17
  5. [Débutant] problème avec les IO de java
    Par Amissan dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 17/11/2006, 16h27

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