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 :

Pb ordre insertion - Mysql


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Points : 56
    Points
    56
    Par défaut Pb ordre insertion - Mysql
    Bonjour à tous,

    J'ai un problème assez simple mais je ne sais comment le résoudre. J'utilise une appli java pour lire et écrire des infos dans une base mysql (easyPhp 1.8).

    Lorsque j'insère des données, je lis un tableau de mon interface graphique (une jXtable) et je réalise des INSERT inclus dans une boucle While parcourant les lignes du tableau. Avant d'effectuer chaque requete, je l'affiche à l'écran afin d'observer l'ordre dans lequel elles sont faires.

    A la lecture des informations, j'obtiens les memes données, dans mon tableau, mais l'ordre est changé.

    J'ai regardé en base par phpmyAdmin et effectivement, l'ordre d'insertion n'est pas respecté. Il y a une incohérence entre l'ordre des requetes INSERT et l'ordre où les tuples sont stockés.

    Comment corriger ce problème ?
    Merci de votre aide.

  2. #2
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Bonjour,
    Comment tu parcours les entrées de la table? Avec l'instruction
    ?
    Si c'est le cas fait attention avant de lancer ton parcours, fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resultset.beforeFirst()
    pour être sûr d'avoir le "pointeur" (sur ta table) qui pointe avant la 1ère entrée.
    Car je pense que ton problème vienne du fait que le "pointeur" ne se trouve pas avent le début de ta table. Ainsi ton application traite d'abord une autre ligne que la première.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    effectivement, je la parcours avec des .next():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    base=new GestionBD(ParamBase);
    sRequete = "SELECT * FROM ma_table WHERE id = '"+sCurId+"'";
    base.requeteSelect(sRequete);
    res = base.getRS();
    while(res.next()) 
    {
         affiche les valeurs
    }
    J'ai tenté le "res.beforeFirst()" avant la boucle while, mais ca ne change rien. Et ce que je trouve bizarre, c'est qu'a la lecture de ma table dans phpmyadmin, je vois bien un ordre inversé.

    L'ordre que je vois dans phpmyadmin correspond à l'ordre d'affichage lors de la lecture des valeurs. Je pense donc que le mélange se fait lors de l'insertion des données. Mais pourquoi....

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Là c'est dû à ta méthode d'insertion... Si tu ne nous donnes pas ton code d'insertion, on va avoir du mal à te répondre

  5. #5
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    La partie de code d'insertion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    base=new GestionBD(ParamBase);
    for( int iCpt = 0; iCpt < jXTable.getRowCount(); iCpt++ )
    {
        sRequete = "INSERT INTO ma_table values('"+_modelCatalogue.getValueAt(iCpt,6)+"','"+jComboBox_Kits.getSelectedItem().toString().trim()+"','"+jXTable.getValueAt(iCpt,0).toString().trim()+"','"+sFormateDescr(jXTable.getValueAt(iCpt,1).toString().trim())+"','"+jXTable.getValueAt(iCpt,3).toString().trim()+"','"+jXTable.getValueAt(iCpt,4).toString().trim()+"')";
        System.out.println("la requete: "+sRequete);
        base.requete(sRequete);
    }
    base.close();

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Oui mais on a aussi besoin de ta méthode requete de GestionBD ...

  7. #7
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    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
     
    public GestionBD(String[] parametres) throws Exception 
    {   
           Class.forName("com.mysql.jdbc.Driver");
           try
           {
               connection = DriverManager.getConnection("jdbc:mysql://"+parametres[0]+":3306/"+parametres[1],parametres[2],parametres[3]);
           }
           catch(Exception e)
           {
                System.out.println("exception en cours!!!");
                throw e;
           }
           finally
           {
     
           }
     }
     
    public void close()  throws SQLException 
       { 
           connection.close(); 
       }
     
       public void requete(String query) throws SQLException
       {
           Statement stmt = connection.createStatement();
           stmt.execute(query);
           stmt.close();
       }
     
       public ResultSet getRS()
       {
           return rs;
       }
     
     
       public void requeteSelect(String query) throws SQLException 
       {
           Statement stmt = connection.createStatement();
           rs = stmt.executeQuery(query);
       }
    J'espere avoir tout envoyé. J'ai entendu parler du autoIncrement ? est ce que ca pourrait arranger les choses ? Comment se met il en place ?

  8. #8
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    A priori ton code est bon ...
    Mais
    J'ai regardé en base par phpmyAdmin et effectivement, l'ordre d'insertion n'est pas respecté
    ça veut dire quoi ?
    C'est quoi ta clé primaire ? Comment sont triées les données de la table ?

  9. #9
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    Ben en fait je n'ai pas défini de clé primaire. La table permet de stocker une liste de matériel et est constituée ainsi:

    id_commande;type_materiel;reference_materiel;nom_materiel;quantite_materiel;prix_unitaire;

    par exemple, un marteau est un outils référencé "4435" coutant 13€. M. xyz de numéro de commande "12345" en achete "2". Cela sera inscrit en base:

    "12345";"outils";"4435";"marteau";"2";"13";

    Pour répondre à la question de comment je le vois, tout simplement en affichant la table dans easyphp. Les lignes sont écrites en fin de tables.
    Reprenant le meme exemple que précédemment, admetons que M. xyz commande 1 marteau, 1 tournevis et 2 scies, l'appli java affiche a l'écran, d'apres les lignes de codes citées précédemment:


    la requete: INSERT INTO ma_table values('12345', 'outils', '4435', 'marteau', '1', '13')";
    la requete: INSERT INTO ma_table values('12345', 'outils', '1346', 'tournevis', '1', '7')";
    la requete: INSERT INTO ma_table values('12345', 'outils', '7324', 'scie', '2', '35')";

    Par contre, la visualisation dans easyphp, en fin de table "ma_table" me donne les lignes suivantes:

    "12345";"outils";"1346";"tournevis";"1";"7";
    "12345";"outils";"4435";"marteau";"1";"13";
    "12345";"outils";"7324";"scie";"2";"35";

  10. #10
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ben sans clé primaire, je ne sais pas comment easyphp te restitue les lignes ... Mais il y a toujours un ordre...
    D'après ce que tu mets, on dirait qu'il te les trie alphanumérique de gauche à droite ...
    C'est bien toujours le cas ?
    Si oui, ça ne veut pas dire que les lignes n'ont pas été insérées dans l'ordre ... Mais simplement que cette notion d'ordre d'insertion n'est pas qqchose qui existe en base "par défaut", et que donc tu perds cette information en stockant les lignes.
    Si tu veux la garder, il faut que tu rajoutes une clé primaire à ta table avec un entier autoincrément ... (cf doc mysql pour ça) et dans ce cas sans changer ton code tu auras les lignes dans le "bon ordre"

  11. #11
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    A priori, apres avoir consulté mes lignes dans ma table, il n'y a pas d'ordre alphanumérique. C'était un hasard pour l'exemple que j'ai donné.

    Je vais donc ajouter une clé primaire avec autoIncrément comme tu me l'as conseillé. Je peux faire ca directement dans easyphp sans passer par mon code java ?

    Car j'ai essayé de rajouter un champ directement depuis phpmyadmin, en mettant en attribut extrat le "autoIncrement".

    A la visualisation de la table dans phpmyadmin, j'ai bien un numéro autoincrémenté dans la colonne que je viens de créer. Mais désormais, mon code plante, il ne retrouve plus les bonnes colonnes du fait que j'en ai rajouté une.

    Cela veut dire que le fait de rajouter une autoincrementation n'est pas transparent pour le code. Si c'est le cas, j'ai aussi vite fait de générer moi meme le numéro indiquant l'ordre d'insertion des tuples.

  12. #12
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Non c'est pas top du tout de gérer toi même ce numéro, tu risquerais d'avoir des problèmes en cas d'accès concurrent.
    Désolé je n'avais pas vu, effectivement il faut légèrement changer ton code, ou plutôt ta requête sql
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO ma_table values ...
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO ma_table (champ1,champ2,champ3,...) values

  13. #13
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 125
    Points : 56
    Points
    56
    Par défaut
    Ok merci. Il va donc falloir que je modifie toutes les requetes "insert" correspondant à cette table. C'est dommage que cela ne soit pas plus transparent, ca m'aurait arrangé !!!

    C'est étrange que les insertions ne se fassent pas tout betement les unes apres les autres, ca aurait été bcp plus simple !

    Merci de ton aide.

  14. #14
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Elles se font bien les unes après les autres ... le seul souci c'est la restitution (cet ordre n'est pas stocké en base).

    Les changements dans ton code, c'est du à mon sens à la "mauvaise" utilisation de insert. Pour moi, il faut toujours préciser les colonnes, sinon effectivement à la moindre modif de la table badaboum !

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

Discussions similaires

  1. select ordre insert
    Par elharet dans le forum SQL
    Réponses: 11
    Dernier message: 26/04/2007, 11h53
  2. [MySQL] Récupérer $_POST et insertion MySql
    Par hugo69 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/12/2006, 20h23
  3. Problèmede insert MySQL avec les DECIMAL
    Par SuperCed dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/04/2006, 17h04
  4. Problème sur requête insert mysql
    Par kcizth dans le forum Requêtes
    Réponses: 5
    Dernier message: 04/02/2006, 18h37

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