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 :

Utilisation de Preparedstatement à la place de Statement pour l'exécution des requêtes


Sujet :

JDBC Java

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut Utilisation de Preparedstatement à la place de Statement pour l'exécution des requêtes
    Bonjour à tous je vois partout que l'utilisation de PreparedStatement est préférable par rapport à celle de Statement. Mon soucis est le suivant j'utilisais une classe pour l’exécution de mes requettes et j'aimerais remplacer l'utilisation de Statement par PreparedStatement pour les requette de type SELECT car j'aimerais avoir le resultats de ce type de requette dans un tableau de String à 2 dimensions:
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    package connexion;
    import message.Message;
    import java.beans.Statement;
    import java.sql.*;
     
    public class ConectDB {
    	  static Connection con = null;
    	  static ResultSet resultats = null;
    	  private Message msg = new Message();
    	public ConectDB() {
     
    		try {
    			Class.forName("org.postgresql.Driver");
    			String url = "jdbc:postgresql://127.0.0.1:5432/BD";
    			String user = "nom-d'utilisateur";
    			String passwd = "mot_de_passe";
    			con = DriverManager.getConnection(url, user, passwd);
    		} catch (Exception e) {
    			new Message().dialog("Problème de connexion à la base de donnée vérifier le réseau "+e.getMessage());
    		}		
    	}
    	  //**********************Exécute les requêtes de MAJ ds la BD**********************************
    	   public void SQLupdate(String req) {
    	     try {
     
    	       java.sql.Statement stmt =  con.createStatement();
    	       ((java.sql.Statement) stmt).executeUpdate(req);
    	      // msg.dialog("requette executée avec succes");
    	     }
    	     catch (SQLException e) {
    	       msg.error("Impossible d'executer la requete : \n" + e);
    	     }
    	   }
     
    	  public void SQLupdateNotResponse(String req) {
    	    try {
     
    	      Statement stmt = (Statement) con.createStatement();
    	      ((java.sql.Statement) stmt).executeUpdate(req);
    	      msg.dialog("requette executée avec succes");
    	    }
    	    catch (SQLException e) {
    	      msg.error("Impossible d'executer la requete: \n" + e.getMessage());
    	    }
    	  }
     
    	//************************************************************************
    	   public boolean SQLupdateResponse(String req) {
    	     try {
     
    	       Statement stmt = (Statement) con.createStatement();
    	       ((java.sql.Statement) stmt).executeUpdate(req);
    	       msg.dialog("requette executée avec succes");
    	       return true;
    	     }
    	     catch (SQLException e) {
    	       msg.error("Impossible d'executer la requete: \n" + e.getMessage());
    	       return false;
    	     }
     
    	   }
     
    	//----------------Exécute les requêtes de lecture ds la BD------------
    	  public void SQLquery(String sql) {
    	    //execution de la requête
     
    	    try {
    	      java.sql.Statement stmt = con.createStatement();
    	      resultats = ((java.sql.Statement) stmt).executeQuery(sql);
    	    }
    	    catch (SQLException e) {
    	      msg.error("Impossible d'exécuter la requête" + e.getMessage());
    	      //System.exit(0);
    	    }
     
    	  }
     
    	//****************Retourne le nombre de ligne de la requête****************
     
    	   public int numRows(String sql) {
    	     int nbre = 0;
    	     SQLquery(sql);
    	     try {
    	       //ResultSetMetaData rsmd = resultats.getMetaData();
    	       //int nbCols = rsmd.getColumnCount();
    	       boolean encore = resultats.next();
    	       while (encore) {
    	         encore = resultats.next();
    	         nbre++;
    	       }
    	       resultats.close();
    	     }
    	     catch (SQLException e) {
    	       msg.error(e.getMessage());
    	     }
    	     return nbre;
    	   }
     
    	//*******************Retourne le nombre de colonne d'un requête**********************************
     
    	   public int numCols(String sql)
     
    	   {
    	     int nbre = 0;
    	     SQLquery(sql);
    	     try {
    	       ResultSetMetaData rsmd = resultats.getMetaData();
    	       nbre = rsmd.getColumnCount();
    	       resultats.close();
    	     }
    	     catch (SQLException e) {
    	       msg.error(e.getMessage());
    	     }
    	     return nbre;
    	   }
     
    	//***************Retourne une matrice de données (résultat de la requête prise en paramètre) *********************
     
    	   public String[][] DataQuery(String query) {
    	     int rows = numRows(query);
    	     int cols = numCols(query);
    	     String[][] donnees = new String[rows][cols];
    	     SQLquery(query);
    	     try {
    	       ResultSetMetaData rsmd = resultats.getMetaData();
    	       int nbCols = rsmd.getColumnCount();
    	       boolean encore = resultats.next();
    	       int numTuple = 0;
    	       while (encore) {
    	         for (int i = 0; i < nbCols; i++) {
    	           donnees[numTuple][i] = resultats.getString(i + 1);
    	         }
    	         encore = resultats.next();
    	         numTuple++;
    	       }
    	       resultats.close();
     
    	     }
    	     catch (SQLException e) {
    	       msg.error(e.getMessage());
    	     }
     
    	     return donnees;
     
    	   }
    }
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  2. #2
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Bonjour junior222,

    Citation Envoyé par junior222 Voir le message
    Mon soucis est le suivant j'utilisais une classe pour l’exécution de mes requettes et j'aimerais remplacer l'utilisation de Statement par PreparedStatement pour les requette de type SELECT
    En utilisant la classe PreparedStatement dans ta classe et en prenant pour exemple la méthode ci dessous :
    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
     
    	//----------------Exécute les requêtes de lecture ds la BD------------
    	  public void SQLquery(String sql) {
    	    //execution de la requête
     
    	    try {
    	      java.sql.Statement stmt = con.createStatement();
    	      resultats = ((java.sql.Statement) stmt).executeQuery(sql);
    	    }
    	    catch (SQLException e) {
    	      msg.error("Impossible d'exécuter la requête" + e.getMessage());
    	      //System.exit(0);
    	    }
     
    	  }
    je peux te la modifier en ceci :

    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
     
    //----------------Exécute les requêtes de lecture ds la BD------------
    public void SQLquery(String sql, String valParametre) {
    //En gardant à l'esprit que sql serait une requête qui attendrait 1 paramètre de type String et ce dernier serait renseigné dans valParametre
     
    PreparedStatement ps = null;
    try {
    ps = con.prepareStatement(sql);
    ps.setString(1, valParametre);
    resultats = ps.executeQuery();
    ps.close();
    }
    catch (SQLException e) {
    msg.error("Impossible d'exécuter la requête" + e.getMessage());
    }
     
    }
    Et voici un petit exemple d'appel à cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ResultSet resultats = null;
    //Ma requête de sélection, le ? représente la valeur du paramère à passer à cette dernière
    String req = "select * from table where clePrimaire = ?"
    //Valeur à renseigner pour le paramètre de la requête
    String val = "A12";
     
    //Appel de la méthode créée plus haut
    SQLquery(req, val);
    Ensuite tu peux exploiter ton "resultats" comme tu en as l'habitude...
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par MasterMbg Voir le message
    Bonjour junior222,



    En utilisant la classe PreparedStatement dans ta classe et en prenant pour exemple la méthode ci dessous :
    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
     
    	//----------------Exécute les requêtes de lecture ds la BD------------
    	  public void SQLquery(String sql) {
    	    //execution de la requête
     
    	    try {
    	      java.sql.Statement stmt = con.createStatement();
    	      resultats = ((java.sql.Statement) stmt).executeQuery(sql);
    	    }
    	    catch (SQLException e) {
    	      msg.error("Impossible d'exécuter la requête" + e.getMessage());
    	      //System.exit(0);
    	    }
     
    	  }
    je peux te la modifier en ceci :

    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
     
    //----------------Exécute les requêtes de lecture ds la BD------------
    public void SQLquery(String sql, String valParametre) {
    //En gardant à l'esprit que sql serait une requête qui attendrait 1 paramètre de type String et ce dernier serait renseigné dans valParametre
     
    PreparedStatement ps = null;
    try {
    ps = con.prepareStatement(sql);
    ps.setString(1, valParametre);
    resultats = ps.executeQuery();
    ps.close();
    }
    catch (SQLException e) {
    msg.error("Impossible d'exécuter la requête" + e.getMessage());
    }
     
    }
    Et voici un petit exemple d'appel à cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ResultSet resultats = null;
    //Ma requête de sélection, le ? représente la valeur du paramère à passer à cette dernière
    String req = "select * from table where clePrimaire = ?"
    //Valeur à renseigner pour le paramètre de la requête
    String val = "A12";
     
    //Appel de la méthode créée plus haut
    SQLquery(req, val);
    Ensuite tu peux exploiter ton "resultats" comme tu en as l'habitude...
    Merci bien de ta reponse mais comment faire lorsque les paramètres ne sont pas tous des String?
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Points : 16 092
    Points
    16 092
    Par défaut
    On regarde la javadoc ici : http://docs.oracle.com/javase/7/docs...Statement.html

    et on se rends compte qu'il y a une palanquée de méthode setXXX avec tous les types possibles.

  5. #5
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Citation Envoyé par junior222 Voir le message
    Merci bien de ta reponse mais comment faire lorsque les paramètres ne sont pas tous des String?
    Suis le lien que Carhiboux t'as fourni. C'est bien complet et je suis sûr que tu apprendras encore d'avantage. Juste un peu d'anglais...
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par MasterMbg Voir le message
    Suis le lien que Carhiboux t'as fourni. C'est bien complet et je suis sûr que tu apprendras encore d'avantage. Juste un peu d'anglais...
    Je comprend tout à fait mon soucis est le suivant dans la méthode que tu a écrites tu passe en paramètre un String. Deux problèmes au mois réside dans cette approche:
    1) Si je veux passer en paramètre un booléen comment je fais? (je réécris une autre méthode cette fois qui prend en paramètre un booléen?)
    2) Si je n'ai pas un mais plusieurs paramètres comment je fais?
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,



    PS : Si, pour passer un String, on utilise setString(index, valeur), et pour un int, setInt(index, valeur), en toute logique, pour un booléen, il suffit de vérifier qu'on a bien un setBoolean(index, valeur), ce qui est le cas.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Citation Envoyé par junior222 Voir le message
    2) Si je n'ai pas un mais plusieurs paramètres comment je fais?
    Bonsoir,
    Alors dans ce cas, rien de plus simple , il suffit de passer dans ta méthode tous ces paramètres (avec leurs types) et d'utiliser les méthodes setXxx() de PreparedStatement pour chacun des types.
    Par exemple :
    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
     
    //----------------Exécute les requêtes de lecture ds la BD------------
    public void SQLquery(String sql, String p1, int p2, boolean p3) {
     
    PreparedStatement ps = null;
    try {
    ps = con.prepareStatement(sql);
    ps.setString(1, p1);
    ps.setInt(2, p2);
    ps.setBoolean(3, p3);
    resultats = ps.executeQuery();
    ps.close();
    }
    catch (SQLException e) {
    msg.error("Impossible d'exécuter la requête" + e.getMessage());
    }
     
    }
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  9. #9
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Ok je comprend tout à fait mais c'est pas encore ce que je veux. Je prend un cas de figure simple:j'ai 2 requettes différentes à exécuter mais le nombre de paramètres est différents d'une requette à l'autre et avec ta méthode on devrais créer autant de requette que de méthode lorsque le nombre et le type de paramètre diffère
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Déjà perso j'aurais plusieurs chose à redire sur le code :
    • Je ne vois aucune raison d'utiliser des champs en static, surtout que la classe ConectDB peut avoir plusieurs instances !
    • Les ressources ne sont pas toujours correctement fermées. Utilises le try-with-resource de Java 7 (ou un try/finnaly).
    • La gestion des exceptions est mauvaise. Tu te contentes de logger en "cachant" l'erreur.
      Si un update échoue tu n'en saura rien dans le programme, qui continuera à tourner comme si de rien n'était.
      Cela peut être très dangereux !


    Citation Envoyé par junior222 Voir le message
    Ok je comprend tout à fait mais c'est pas encore ce que je veux. Je prend un cas de figure simple:j'ai 2 requettes différentes à exécuter mais le nombre de paramètres est différents d'une requette à l'autre et avec ta méthode on devrais créer autant de requette que de méthode lorsque le nombre et le type de paramètre diffère
    Oui et ce serait le plus propre.

    Maintenant tu peux très bien utiliser une méthode avec arguments variables, et utiliser setObject() du PreparedStatement qui effectuera le bon type selon le type réel du paramètre...


    a++

  11. #11
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Points : 1 493
    Points
    1 493
    Par défaut
    Citation Envoyé par junior222 Voir le message
    j'ai 2 requettes différentes à exécuter mais le nombre de paramètres est différents d'une requette à l'autre et avec ta méthode on devrais créer autant de requette que de méthode lorsque le nombre et le type de paramètre diffère
    Si tu ne veux pas créer autant de méthodes que de requêtes, ce qui parrait plus simple, tu peux essayer ce code inspiré de l'idée avancée par adiGuba
    Maintenant tu peux très bien utiliser une méthode avec arguments variables, et utiliser setObject() du PreparedStatement qui effectuera le bon type selon le type réel du paramètre...
    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
     
    public static ResultSet sqlQuery(Connection cn, String requeteSql, Object... listeParametre) {
            PreparedStatement ps = null;
            try {
                ps = cn.prepareStatement(requeteSql);
                byte i = 1;
                for (Object parametre : listeParametre) {
                    ps.setObject(i, parametre);
                    i++;
                    System.out.println(parametre);
                }
                //Exécution de la requête
                ps.executeQuery();
                ResultSet rs = ps.getResultSet();
                return rs;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    Lors de l'appel de cette méthode, tu passes pour le premier paramètre ta variable Connection, pour le second paramètre ta requête de sélection et pour le dernier paramètre tous les paramètres de la dernière requête séparés par des virgules. Tu pourras récupérer dans une variable le ResultSet renvoyé par la méthode

    Je n'ai pas eu le temps de tester le code, si il y a bug prière de les renvoyer.
    A+
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  12. #12
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Bon j'ai trouvé une solution qui me conviens largement voilà une classe pour récupérer les données sous forme de tableau à deux dimensions d'objets
    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
    59
    60
    61
    62
    63
    64
    65
     
    package connexion_bd;
     
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
     
    import message.Message;
     
    public class Recuperer_Donnees_BD {
    	PreparedStatement pre;
    	public Recuperer_Donnees_BD(PreparedStatement pre) {
    		this.pre=pre;
    	}
    	   public int numCols()
    	   {		 
    	     int nbre = 0;	     
    	     try {
    	       ResultSet resultats=pre.executeQuery();
    	       ResultSetMetaData rsmd = resultats.getMetaData();
    	       nbre = rsmd.getColumnCount();	       	       
    	     }
    	     catch (SQLException e) {
    	       new Message().error(e.getMessage());
    	     }
    	     return nbre;
    	   }
    	   public int numRows() {
    		   int nbre = 0;		     
    		   try {
    			   ResultSet resultats=pre.executeQuery();
    		       boolean encore = resultats.next();
    		       while (encore) {
    		         encore = resultats.next();		         
    		         nbre++;
    		       }		       
    		     }
    		     catch (SQLException e) {
    		       new Message().error(e.getMessage());
    		     }		   
    		     return nbre;
    		 }
    	   public Object[][] DataQuery() {
    		     int rows = numRows();
    		     int cols = numCols();
    		     Object[][] donnees = new String[rows][cols];			     
    		     try {		       		       		       
    		       ResultSet resultats=pre.executeQuery();
    		       boolean encore = resultats.next();		       
    		       int numTuple = 0;
    		       while (encore) {		    	   
    		         for (int i = 0; i < cols; i++) {
    		           donnees[numTuple][i] = resultats.getObject(i + 1);		           
    		         }
    		         encore = resultats.next();
    		         numTuple++;
    		       }		       		       
    		     }
    		     catch (SQLException e) {
    		       new Message().error(e.getMessage());
    		     }
    		     return donnees;
    		   }	
    }
    Maintenant attention! Pour tous champs qui n'est pas un string il faut le concaténer avec le vide pour que ça marche. Merci à tous
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si ça te convient de faire trois fois la même requête... mais j'ai rien compris au sujet de concaténation avec le vide
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Si ça te convient de faire trois fois la même requête... mais j'ai rien compris au sujet de concaténation avec le vide
    C'est simple lorsque vous faites un select sur un champ qui est de type entier par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select champ from table
    Si la requeete doit retourner un entier ça ne vas pas marcher il faut donc faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select concat(champ,'') as champ from table
    Pour que ça marche
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si on a un champ de type entier, on peut tout à fait le lire comme un entier (Integer) et le mettre dans un tableau, sans avoir à le "convertir" en String. Et il y a d'autres moyens, selon les SGBD de convertir un champ en String que la concaténation (genre convert par exemple).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Si on a un champ de type entier, on peut tout à fait le lire comme un entier (Integer) et le mettre dans un tableau, sans avoir à le "convertir" en String. Et il y a d'autres moyens, selon les SGBD de convertir un champ en String que la concaténation (genre convert par exemple).
    J'ai l'impression que tu ne saisi pas le rôle de la manœuvre en fait ici le get0bject ne marche pas avec des champ autres que les string donc fallait trouver une manip pour remédier à cela
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  17. #17
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    La méthode getObject() fonctionne avec tous les types. Pourquoi aurait-t-on besoin de getString() si getObject() ne fonctionnait qu'avec les String, et pourquoi elle retournerait de l'Object, si elle ne retournait que du String (sans parler de son nom) ?

    EDIT : on lisant ton code, je vois que tu as crées un tableau de String : c'est pour cette raison que tu es obligé de lire des String. Ce tableau String[][] n'accepte en effet que des String. Mais rien à voir avec la partie DB.

    EDIT2: avec ton code modifié, ça donnerait ça :

    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
    public class Recuperer_Donnees_BD {
       PreparedStatement pre;
       public Recuperer_Donnees_BD(PreparedStatement pre) {
    		this.pre=pre;
       } 
     
      public Object[][] DataQuery() {
        try {		       		       		       
          ResultSet resultats=pre.executeQuery();
          ResultSetMetaData rsmd = resultats.getMetaData();
          int nbCols = rsmd.getColumnCount();	       	
     
          List<Object[]> results = new ArrayList<>();
     
          while (resultats.next()) {		    	   
            Object[] tuple = new Object[nbCols];
            for (int i = 0; i < nbCols; i++) {
                tuple[i] = resultats.getObject(i + 1);		           
            }
            results.add(tuple);
          }		       		        		     
     
          return results.toArray();
     
        }
        catch (SQLException e) {
          new Message().error(e.getMessage());
        } 
        return null;
      }	   
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  18. #18
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    La méthode getObject() fonctionne avec tous les types. Pourquoi aurait-t-on besoin de getString() si getObject() ne fonctionnait qu'avec les String, et pourquoi elle retournerait de l'Object, si elle ne retournait que du String (sans parler de son nom) ?

    EDIT : on lisant ton code, je vois que tu as crées un tableau de String : c'est pour cette raison que tu es obligé de lire des String. Ce tableau String[][] n'accepte en effet que des String. Mais rien à voir avec la partie DB.
    Ah ok merci je vois d'où venais mon erreur ça marche très bien sans concaténation faut remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[][] donnees = new String[rows][cols];
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[][] donnees = new Object[rows][cols];
    Au fait il y a un problème avec ton 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
    package connexion_bd;
     
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.ArrayList;
     
    import message.Message;
     
    public class Recuperer_Donnees_BD {
    	PreparedStatement pre;
    	public Recuperer_Donnees_BD(PreparedStatement pre) {
    		this.pre=pre;
    	}		 
    		  public Object[][] DataQuery() {
    		    try {		       		       		       
    		      ResultSet resultats=pre.executeQuery();
    		      ResultSetMetaData rsmd = resultats.getMetaData();
    		      int nbCols = rsmd.getColumnCount();	       	
     
    		      ArrayList<Object[]> results = new ArrayList<>();		 
    		      while (resultats.next()) {		    	   
    		        Object[] tuple = new Object[nbCols];
    		        for (int i = 0; i < nbCols; i++) {
    		            tuple[i] = resultats.getObject(i + 1);		           
    		        }
    		        results.add(tuple);
    		      }		       		        		     
     
    		      return results.toArray();
     
    		    }
    		    catch (SQLException e) {
    		      new Message().error(e.getMessage());
    		    } 
    		    return null;
    		  }
    }
    l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     return results.toArray();
    ne retourne pas un tableau d'objet à 2 dimensions
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

  19. #19
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par junior222 Voir le message
    l'instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     return results.toArray();
    ne retourne pas un tableau d'objet à 2 dimensions
    Juste ! Il fallait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return results.toArray(new Object[results.size()][nbCols]);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  20. #20
    Membre actif
    Homme Profil pro
    Ingénieur de construction de réseaux
    Inscrit en
    Août 2012
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur de construction de réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 406
    Points : 235
    Points
    235
    Par défaut
    ça marche et c'est correct une fois de plus merci encore.
    La force d'un programmeur ne réside pas dans le fait qu'il écrive des codes puissants mais dans sa capacité à les maintenir!!!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/01/2013, 17h41
  2. Réponses: 2
    Dernier message: 02/03/2010, 12h50
  3. Réponses: 3
    Dernier message: 05/05/2006, 11h41
  4. Utiliser une image à la place du curseur par défaut
    Par nice dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 11/12/2005, 22h15
  5. Réponses: 2
    Dernier message: 05/07/2004, 17h50

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