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 :

[jdbc] probleme lors d'une requete avec un PreparedStatement


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut [jdbc] probleme lors d'une requete avec un PreparedStatement
    bonjour,

    je dois effectuer une insertion dans une base de données mysql. j'ai une table avec deux champs, dont la clef en auto-increment.

    j'ai une premiere methode qui me permet de preparer ma requete pour une insertion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void paramPrstmtInsert() {
                    try {
                            prstmt = conn.prepareStatement("INSERT INTO ? VALUES ('?')"); 
                    } catch (SQLException E) {
                            System.out.println("Erreur lors de la preparation du preparedStatement");
                            System.out.println("SQLException : " + E.getMessage());
                    }
            }
    conn : objet Connect
    prstmt : objet PreparedStatement

    Les paramètres à entrer par la suite correspondent donc au nom de la table (avec eventuellement les champs concernés entre parenthèse) et les données à inserer dans les champs de la base.

    puis j'ai une deuxieme méthode qui me permet d'inserer mes données à partir de ma requete paramétrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public int insertDatabase(String param1, String param2) {
                    int nb =0;
                     try {
                            prstmt.setString(1, param1);
                            prstmt.setString(2, param2);
                            nb = prstmt.executeUpdate(); 
                    } catch (SQLException E) {
                            System.out.println("Erreur lors de l'envoie à la requete : ");
                            System.out.println("SQLException : " + E.getMessage());
                    } 
                    return nb;
            }
    dans mon programme de test, je commence à me connecter à ma base, puis j'applique mes 2 requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ConnectionBase connection2 = new ConnectionBase();
    connection2.connect("mabase", "root", "monpswd");
    connection2.paramPrstmtInsert();
    connection2.insertDatabase("matable(monchamps)", "données_a_inserer");
    Cependant, lors de l'execusion, j'ai cette erreur :
    SQLException : Parameter index out of range (2 > 1).
    savez vous d'ou peut venir mon probleme? je ne vois pas ou je peux etre en dehors des index.

    merci d'avance.

  2. #2
    Membre actif
    Inscrit en
    Avril 2004
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 238
    Points : 265
    Points
    265
    Par défaut
    Salut,

    Ton second parametre pour ta requete est entre ' ' donc java ne le considere pas comme un parametre potentiel.
    L'erreur est donc bien que tu veux lui passer 2 parametres mais qu'il n'y en a qu'un (2>1).

    Essaye d'enlevé les ' ' ou met \' \' je sias pas trop.
    Mais ca vient de la

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Peut-etre que dans ta fonction insertDatabasetu devrais commencer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    prstmt.setString(0,param1);

  4. #4
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    je ne peux aps commencer par un 0 pour l'entrée de mon paramètre, mais par 1.
    je regarde en enlevant les ' ' si ça marche.

    merci

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    essaie d'enlever les simpleQuote autour de ton deuxieme point d'interogation
    car avec simple quote il prend ca pour un caractere
    ou alors essaie comme ca \'?\'

  6. #6
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    donc, sans les ' ', il me met cette erreur :
    SQLException : Syntax error or access violation, message from server: "You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''matable(monchamps)' VALUES ('\'données_a_inserer\'')' at line 1"
    de mme si j'essaie de mettre les ' ' au niveau de mon prgramme test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connection2.insertDatabase("matable(monchamps)", " \'données_a_inserer \' ");
    et si je lui met \'?\', j'ai de nouveau le meme probleme qu'au debut : index out of range....

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 40
    Points : 30
    Points
    30
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prstmt = conn.prepareStatement("INSERT INTO ? VALUES ("+"'"+"?"+"')");
    peut etre comme ca mais je te garanti rien moi je ne travaille jamais comme ca, je fais plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    stmt.executeUpdate("insert into "+nom+" values( '"+deg+"' , curtime() , '"+log+"' )");

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    je crois qu'il ne faut pas mettre les cotes autour du point d'interrogation
    met quand tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update.setString(2,"coco");
    donc je suppose qu'il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String j = "coco";
    et la tu peus faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update.setString(2,j);

  9. #9
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    IL NE FAUT PAS METTRE DE QUOTES autours du point d'intérrogation, essaie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void paramPrstmtInsert() { 
      try { 
        prstmt = conn.prepareStatement("INSERT INTO ? VALUES (?)"); 
      }
      catch (SQLException E) { 
        System.out.println("Erreur lors de la preparation du preparedStatement"); 
        System.out.println("SQLException : " + E.getMessage()); 
      } 
    }
    INSERT INTO ? VALUES (?)
    c'est quoi cette clause sql !!!

    INSERT INTO MA_TABLE ? VALUES (?)

  10. #10
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    j'ai résolu le probleme en utilisant la methode suggéré par maxidoove.
    j'aurais préféré passer par une requete paramétrée, mais, ça marche ainsi, et la requete paramétrée n'est pas une obligation (c'est plutot moi qui voulait absolument le faire marcher ainsi....)

    bref, ça fonctionne ainsi, et je n'ai aps le temps de chercher à la faire fonctionner autrement.

    merci pour votre aide

  11. #11
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    IL NE FAUT PAS METTRE DE QUOTES autours du point d'intérrogation, essaie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void paramPrstmtInsert() { 
      try { 
        prstmt = conn.prepareStatement("INSERT INTO ? VALUES (?)"); 
      }
      catch (SQLException E) { 
        System.out.println("Erreur lors de la preparation du preparedStatement"); 
        System.out.println("SQLException : " + E.getMessage()); 
      } 
    }
    INSERT INTO ? VALUES (?)
    c'est quoi cette clause sql !!!

    INSERT INTO MA_TABLE (COLUMN_NAME) VALUES (?)

    ou

    INSERT INTO MA_TABLE VALUES (?)

    Désolé pour le message en doublon, j'ai merdé

  12. #12
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    heuu, c'est pas la peine de t'ennerver comme ça.....


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ? VALUES (?)
    je voulais pouvoir paramétrer ma requete au niveau de la table à modifier et des données à inserer.
    le premier ? aurait donc correspondu à : matable(monchamps)

    c'est tout...

  13. #13
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Je ne pense pas me tromper en disant que c'est impossible, comment veux-tu qu'il optimise la requête paramétrée (qu'il crée un plan d'éxécution...) si il ne connais pas le nom de la table !!! (il ne peut pas deviner la structure de la table...)

    Dans ce cas il faut utiliser une requête non paramétrée...

  14. #14
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 41
    Points
    41
    Par défaut
    je viens de passer à une requete non paramétrée justement.
    le probleme, c'est que meme quand je lui spécifiais le nom de la table et la colonne (lors de différents test), il me faisait la meme erreur.

    mais bon, mon code marche, et je saurais maintenant qu'on ne peut effectuer une requete paramétrée sans spésifier le nom de la table

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

Discussions similaires

  1. Probleme lors d'une requete
    Par theoffss dans le forum VB.NET
    Réponses: 4
    Dernier message: 02/05/2008, 16h03
  2. Réponses: 4
    Dernier message: 24/05/2007, 13h36
  3. probleme sur une requete avec DISTINCT
    Par samsso2006 dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/05/2007, 14h35
  4. probleme lors d'une requete sql (controle non activé)
    Par junty dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/09/2005, 15h45
  5. Probleme d'execution d'une requete avec un Count
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 23/06/2004, 10h33

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