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 :

Prepare Statement jdbc


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut Prepare Statement jdbc
    Je veux faire des PrepareStatement en java, mais je sais pas quoi initialiser pour cela fonctionne.

    L'erreur est dans le main

    Voici

    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 class Exercice2 {
     
     
    	static Connection con;
     
    	public static void connecter(){
    		String user = null;
    		String pw = null;
    		String url = null;
    		Properties p = new Properties();
    		BufferedInputStream bis = null;
     
     
    		try{
    			bis = new BufferedInputStream(new FileInputStream("propertie.txt"));
    			p.load(bis);
    			url = p.getProperty("url");
    			user = p.getProperty("user");
    			pw = p.getProperty("pw");
    			bis.close();
    		}catch (IOException e){
    			e.printStackTrace();
    		}
    		try{
    			Class.forName("oracle.jdbc.OracleDriver");
    			con = DriverManager.getConnection(url, user, pw);
    		}catch(SQLException e){
    			System.err.println("Connection Impossible");
    			e.printStackTrace();
    		}catch(ClassNotFoundException e){
    			System.err.println("ClassNotFoundExceptio(problèmes de driver?)");
    		}
    	}
    	public static void main(String[] args) {
     
     
     
     
     
    		PreparedStatement prep1 = con.prepareStatement("");
    }
    }
    Il me manque quelque chose, mais je ne sais pas quoi ?

  2. #2
    Membre confirmé Avatar de supermanu
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    330
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 330
    Points : 452
    Points
    452
    Par défaut
    Tu veux dire que tu ne sais pas quoi mettre entre les guillemets dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PreparedStatement prep1 = con.prepareStatement("");
    ?

    Oui si tu as une erreur, il faudrait la poster ;-)

  3. #3
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Il te manque beaucoup de choses :
    • L'appel de la méthode connecter() pour éviter la NullPointerException sur con
    • Ta requête? où est elle?

    Tu devrais regarder cette partie de la FAQ : Les instructions paramétrées - PreparedStatement

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    j'ai pas mis de requête encore.

    Je ne sais pas comment déclarer une connection avec un Prepare Statement

    Erreur ici :

    con.

  5. #5
    Membre confirmé Avatar de supermanu
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    330
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 330
    Points : 452
    Points
    452
    Par défaut
    Comme le dit CheryBen, il faudrait d'abord que tu exécute ta méthode connecter() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static void main(String[] args) {
      Exercice2.connecter();
      ...
    }
    C'est elle qui initialise la connexion.

    Ensuite tu peux exécuter une requête avec un PreparedStatement.

    Dans ce cas tu peux par exemple écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    String sql = "SELECT * FROM user";
    PreparedStatement prep1 = con.prepareStatement(sql);
    ResultSet res = prep1.executeQuery();
    Et pour les subtilités (passage de paramètres...), il faut regarder la FAQ

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Je réussi à faire quelque chose :

    Voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try{
    			con.setAutoCommit(true);
    			String sql = "INSERT INTO activite(unInt, unString, unDouble, unInt) VALUES(?,?,?,?)";
    			PreparedStatement statement = con.prepareStatement(sql);
    Voici ma table...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NO_ACTIVITE  NOM  MONTANT  DUREE  
    120  danse  250  120  
    121  soccer  200  300  
    122  hockey  300  450  
    123  baseball  180  600  
    124  football  350  180  
    125  tennis  50  200  
    126  course  75  90  
    127  karate  110  75  
    128  piscine  90  50  
    129  badminton  130  175
    je dois crée 5 requêtes paramétrés donc 2 afficher à l'écran à l'aide d'un JOptionPane.

    Quelqu'un peut me donner un exemple de requête !

    Merci

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Je veux faire une requete dans un input dialog.

    Si quelqu'un peut m'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PreparedStatement prep1 = con.prepareStatement("SELECT * FROM activite WHERE no_activite = ?");
    			prep1.setInt(Integer.parseInt(JOptionPane.showInputDialog(null, "Entrez le numéro de l'activité")));

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Mon programme semble-t-il correct ?

    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
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    package Labo1;
     
    import java.sql.*;
    import java.util.StringTokenizer;
    import java.io.*;
     
    import javax.swing.JOptionPane;
     
    /**
     * Programme de démonstration de JDBC.
     * Permet de se connecter à la BD Oracle et de tester différentes commandes SQL sur
     * une table représentant les consommations de café de différents programmeurs.
     *
     * <UL>
     * <LI><code>java 0 nomBD</code> pour accéder à une BD ODBC </LI>
     * <LI><code>java 1 nomBD nomUtilisateur motDePasse</code> pour accéder à BD ORACLE sur Hoff</LI>
     * <UL>
     * <P>
     * Les différentes opérations possibles sont :
     * <UL>
     *   <LI>Supprimer la table</LI>
     *   <LI>Créer et charger la table depuis un fichier</LI>
     *   <LI>Afficher le nom de la personne qui a consommé le plus de tasses de café en une
     *       journée ainsi que sa consommation ce jour là.</LI>
     *   <LI>Afficher le nombre total de tasses consommées.</LI>
     *   <LI>Afficher le nombre total de tasses consommées par un programmeur donné et
     *        le détail des consommations de celui-ci.</LI>
     *   <LI>Afficher les méta données concernant le résultat d'une requête quelconque</LI>
     *   <LI>Exécuter une requête quelconque saisie au clavier et afficher ses résultats</LI>
     *
     */
    public class DemoJDBC {
     
    	static Statement stmt;
    	static Connection con;
     
    	public static Connection getConnection(){
    		try{
    			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    			Class.forName("oracle.jdbc.OracleDriver");
    		}catch(ClassNotFoundException e){
    			System.err.print("ClassNotFoundException: ");
    			System.err.println(e.getMessage());
    		}try{
    			con = DriverManager.getConnection("jdbc:oracle:thin:@oracle1:1521:orcl", "ora05", "ps3");
    		}catch(SQLException ex){
    			System.err.println("SQLException: " + ex.getMessage());
    		}
    		return con;
    	}
     
     
     
    	public static void creerEtInitialiserTable() {
    		Connection con = getConnection();
    		try {
    			stmt = con.createStatement();
     
    			stmt.executeUpdate("CREATE TABLE JoltData ( "
    					+ "Programmeur varchar(32)," + "Jour char(3),"
    					+ "NbTasses integer " + ")");
    			stmt.close();
    			con.close();
     
     
    		} catch (SQLException e) {
    			System.err.println("SQLException:" + e.getMessage());
    		}
    		JOptionPane.showMessageDialog(null,"La table JoltData a été crée !");	
    		}
     
     
     
    	/**
             * destruction de la table.
             */
    	public static void supprimerTable() {
    		Connection con = getConnection();
    		try {
    			stmt = con.createStatement();
     
    			stmt.executeUpdate("DROP TABLE JoltData");
    			stmt.close();
    			con.close();
     
     
    		} catch (SQLException e) {
    			System.err.println("SQLException:" + e.getMessage());
    		}
    		JOptionPane.showMessageDialog(null,"La table JoltData a été supprimée !");	
    		}
     
    	/**
             * intialiasitation de la table JoltData à partir des données lues dans un fichier texte.
             */
    	/*public static void chargerBase() {
     
    		try{
     
        		Statement stmt = con.createStatement();
        		StringTokenizer st = new StringTokenizer(ligne);
                System.out.println(" ");
               
                while (st.hasMoreTokens()){
                    System.out.println("INSERT INTO JoltData VALUES ('"+st.nextToken()+"','"+st.nextToken()+"',"+Integer.parseInt(st.nextToken())+")");
                    stmt.execute("INSERT INTO JoltData VALUES ('"+st.nextToken()+"','"+st.nextToken()+"',"+Integer.parseInt(st.nextToken())+")");
                    
                }
        	
        	}catch(Exception e){
        		e.printStackTrace();
        	}
        }*/
     
     
    	/**
             * Affiche le nom de la personne qui a consommé le plus de tasses de café en une journée ainsi
             * que sa consommation ce jour la, puis la liste des personnes ordonnee par ordre décroissant
             * du nombre de consommations.
     
             */
    	public static void nbreTassesMax() {
    		Connection con = getConnection();
    		String result = null;
    		try {
    			stmt = con.createStatement();
    			ResultSet rs = stmt.executeQuery(("SELECT Programmeur, Jour, MAX(NbTasses) AS maxTasses FROM JoltData GROUP BY Programmeur, Jour ORDER BY MaxTasses DESC"));
    			while (rs.next()) {
    			    String prog = rs.getString("Programmeur");
    			    int tasses = rs.getInt("maxTasses");
    			    String jour = rs.getString("Jour");
    			    result += prog + "\n" + tasses + "\n" + jour; 
     
    			}
    			stmt.close();
    			con.close();
     
    		} catch(SQLException ex) {
    			System.err.println("SQLException: " + ex.getMessage());
    		}
    	JOptionPane.showMessageDialog(null, result);
    	}
     
     
     
     
     
     
     
    	/**
             * affiche le nombre total de tasses consommées.
             */
    	public static void nbreTotalTasses() {
    		Connection con = getConnection();
    		String result = null;
    		try {
    			stmt = con.createStatement();
    			ResultSet rs = stmt.executeQuery(("SELECT SUM(NbTasses) AS somme FROM JoltData"));
    			while (rs.next()) {
    			    int total = rs.getInt("somme");
     
    			    result += total;
     
    			}
    			stmt.close();
    			con.close();
     
    		} catch(SQLException ex) {
    			System.err.println("SQLException: " + ex.getMessage());
    		}
    	JOptionPane.showMessageDialog(null, result);
    	}
     
     
    	/**
             * Renvoie le nombre total de tasses consommées par un programmeur donné et affiche le détail
             * des consommations de celui-ci.
             */
    	public static void nbreTotalTassesPgm() {
    		Connection con = getConnection();
    		String result = null;
    		try {
    			stmt = con.createStatement();
    			ResultSet rs = stmt.executeQuery("SELECT SUM(NbTasses) AS somme FROM JoltData " +
                        "GROUP BY Programmeur HAVING Programmeur = '");
    			while (rs.next()) {
    			    int total = rs.getInt("somme");
     
    			    result += total;
     
    			}
    			stmt.close();
    			con.close();
     
    		} catch(SQLException ex) {
    			System.err.println("SQLException: " + ex.getMessage());
    		}
    	JOptionPane.showMessageDialog(null, result);
    	}
     
     
     
    	/**
             * affiche le menu présentant les différentes opérations possibles
             */
    	public static void affMenu() {
    		System.out.println("\n\n------------------------------------------");
    		System.out.println("1 : Créer et remplir la table");
    		System.out.println("2 : Supprimer la table");
    		System.out.println("3 : Personne ayant consommé max café");
    		System.out.println("4 : Liste personnes");
    		System.out.println("5 : Total tasse de café vendues en une semaine");
    		System.out.println("6 : Pour un programmeur total tasse de café");
    		System.out.println("0 : Quitter");
    	}
     
    	public static void main(String[] args) {
    		int rep = 9;
     
     
    		do {
    			affMenu();
    			System.out.println("votre choix : ");
    			try {
    				BufferedReader LectureClavier = new BufferedReader(
    						new InputStreamReader(System.in));
    				rep = Integer.parseInt(LectureClavier.readLine());
     
    			} catch (Exception e) {
    				System.exit(0);
     
    			}
     
    			System.out.println("\n\n");
     
    			switch (rep) {
    			case 0:
    				System.out.println("au revoir");
    				break;
    			case 1:
    				creerEtInitialiserTable();
    				break;
    			case 2:
    				supprimerTable();
    				break;
    			case 3:
    				nbreTassesMax();
    				break;
    			case 4:
    				nbreTotalTasses();
    				break;
    			case 5:
    				nbreTotalTassesPgm();
    				break;
    			case 6:
    				//chargerBase();
    				break;
     
    			default:
    				System.out.println("valeur erronée !");
    			} // end switch
     
    		} while (rep != 0);
     
    		// Fermer la connexion à Oracle
    		//TO DO
    	}
     
    }

  9. #9
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Dans l'absolu, cela m'a l'air correcte. Par contre il y a différents points améliorables :
    • A quoi cela te sert : Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ? ce n'est pas le driver utilisé.
    • Tu devrais utiliser des PreparedStatement comme indiqué précédemment.
    • Tu ne fermes pas proprement tes ressources, par rapport aux exceptions. Pour le faire, regarde la méthode utilisée ici : FAQ : Doit on fermer un Statement ?
    • con étant statique, tu ne devrais pas l'ouvrir et la fermer à chaque requête. Tu devrais plutôt tester si elle est null ou pas, et soit l'ouvrir ou la réutiliser telle quelle. Tu gagneras en performance puisque la connexion ne sera ouverte qu'une seule fois.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      public static void creerEtInitialiserTable() {
          if(con == null) {
              getConnection();    
          }
          try {
          // blabla ta requête...
    • Inutile de faire con = getConnection(), car dans getConnection(), tu affectes déja con

    Voila, j'espère que cela te conviendra.

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par CheryBen Voir le message
    Dans l'absolu, cela m'a l'air correcte. Par contre il y a différents points améliorables :
    • A quoi cela te sert : Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ? ce n'est pas le driver utilisé.
    • Tu devrais utiliser des PreparedStatement comme indiqué précédemment.
    • Tu ne fermes pas proprement tes ressources, par rapport aux exceptions. Pour le faire, regarde la méthode utilisée ici : FAQ : Doit on fermer un Statement ?
    • con étant statique, tu ne devrais pas l'ouvrir et la fermer à chaque requête. Tu devrais plutôt tester si elle est null ou pas, et soit l'ouvrir ou la réutiliser telle quelle. Tu gagneras en performance puisque la connexion ne sera ouverte qu'une seule fois.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      public static void creerEtInitialiserTable() {
          if(con == null) {
              getConnection();    
          }
          try {
          // blabla ta requête...
    • Inutile de faire con = getConnection(), car dans getConnection(), tu affectes déja con

    Voila, j'espère que cela te conviendra.
    Mon seul problème, c'est lire les données dans le fichier

    Voici mon 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
    public static void chargerBase(String ligne) {
     
    		try{
     
        		Statement stmt = con.createStatement();
        		StringTokenizer st = new StringTokenizer(ligne);
                System.out.println(" ");
     
                while (st.hasMoreTokens()){
                    System.out.println("INSERT INTO JoltData VALUES ('"+st.nextToken()+"','"+st.nextToken()+"',"+Integer.parseInt(st.nextToken())+")");
                    stmt.execute("INSERT INTO JoltData VALUES ('"+st.nextToken()+"','"+st.nextToken()+"',"+Integer.parseInt(st.nextToken())+")");
     
                }
     
        	}catch(Exception e){
        		e.printStackTrace();
        	}
        }
    Je veux chargerBase() dans la méthode creerEtInitialiserTable()

    Je ne sais pas comment m'y prendre.

    Est-ce que ma méthode chargerBase() est bien fait ?

  11. #11
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Tout dépend de ce que tu as dans la String ligne. Tu n'auras que 3 mots?

    Par contre tu as une erreur là, tu fais st.nextToken dans System.out.println et stmt.execute. Du coup tu vas arriver à la fin du StringTokenizer rien que dans System.out.println, puisque le pointeur avance.

    Je ne suis pas sûr que ce que je dis soit très clair là...

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    C'est le fichier du haut que je veux lire dedans :

    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
    Gilbert Mon 1
    Wally Mon 2
    Edgar Tue 8
    Wally Tue 2
    Eugene Tue 3
    Josephine Wed 2
    Eugene Thu 3
    Gilbert Thu 1
    Clarence Fri 9
    Edgar Fri 3
    Josephine Fri 4
    CriCri Mon 4
    Alain Mon 8
    Anne Tue 5
    François Mon 2
    Phil Mon 1
    Véro Mon 5
    Danielle Mon 4
    Véro Tue 6
    CriCri Tue 3
    Danielle Tue 7
    Fred Wed 4
    Hidde Tue 3
    Fred Mon 2
    Alain Tue 9
    Alain Wen 10
    Donc oui 3 mot en gros...

    Je veux remplir la table avec ces données et je ne suis pas sur de mon affaire

  13. #13
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Où se trouve ton code de lecture du fichier? cela devrait t'aider : Comment lire un fichier ligne par ligne ?

    Plutôt que de faire un StringTokenizer, tu devrais plutôt utiliser la méthode de String split().

    Et utilises un PreparedStatement, étant donné le nombre de fois où tu vas appeler la requête d'insertion, tu verras que c'est plus rapide.

  14. #14
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par CheryBen Voir le message
    Et utilises un PreparedStatement, étant donné le nombre de fois où tu vas appeler la requête d'insertion, tu verras que c'est plus rapide.
    +1.

    En plus c'est un peu le sujet de la discussion. Pourquoi tu ne les utilises pas finalement ?

    Sinon, je sais que ça change un peu les choses mais, Oracle dispose d'un outil spécial pour charger les données d'un fichier dans la base : SQLLoader.

    Vu que c'est fait exprès pour, je t'invite à te renseigner dessus.

    Si tu tiens quand même à passer par java pour charger les données en base, utilise le "mode batch" des prepared statement, ça améliorera tes performances :

    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
    PreparedStatement ps = con.prepareStatement("INSERT INTO JoltData VALUES (?,?,?)");
     
    String[] lineContent = null;
    String line = null;
     
    // pour chaque ligne du fichier
    // disons que tu utilises split comme le conseille CheryBen
    while ((line = buff.readLine()) != null) { // cf la FAQ
        lineContent = line.split(" ");
     
        if(lineContent.length == 3) {
           ps.setString(1,lineContent[0]);
           ps.setString(2,lineContent[1]);
           ps.setInt(3,Integer.parseInt(lineContent[2])); // peut être devrais tu gérer la possible exception ?
           ps.addBatch(); // en gros tu crées une file de requetes
        }
     
        ps.executeBatch(); // paf tu exécutes en une seule fois
    }
    Et n'oublie pas le commit à la fin ...

  15. #15
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Ça revient au même de ce que j'ai fais :

    Voici :

    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
    public static void chargerBase() {
     
    		String ligne = null;
    		String[] aLigne;
     
    		try {
    			PreparedStatement pstmt = con
    					.prepareStatement("INSERT INTO JoltData(Programmeur, Jour , NbTasses ) VALUES(?,?,?)");
    			BufferedReader in = new BufferedReader(new FileReader(
    					"test_data.txt"));
     
    			while ((in.readLine()) != null) {
    				ligne = in.readLine();
    				aLigne = ligne.split(" ");
    				for (int i = 0; i < 3; i++) {
    					pstmt.setString(i + 1, aLigne[i]);
    				}
    				pstmt.addBatch();
    			}
    			pstmt.executeBatch();
    		} catch (BatchUpdateException s) {
    			System.out.println("SQL statement n'est pas exécuté!");
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    	}
    Il me reste un SELECT à faire.

    Il faut que j'affiche le nom de la personne qui a consommé le plus de tasses de café en une journée ainsi que sa consommation ce jour la.

  16. #16
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Je ne comprend pas. Il m'affiche 24 programmeurs plutôt que 26 programmeurs

    Voici mon 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
    public static void chargerBase() {
     
    		String[] lineContent = null;
    		String line = null;
     
    		try {
    			PreparedStatement ps = con
    					.prepareStatement("INSERT INTO JoltData VALUES (?,?,?)");
     
    			BufferedReader in = new BufferedReader(new FileReader(
    					"test_data.txt"));
     
    			while ((line = in.readLine()) != null) {
    				lineContent = line.split(" ");
    				if (lineContent.length == 3) {
    					ps.setString(1, lineContent[0]);
    					ps.setString(2, lineContent[1]);
    					ps.setInt(3, Integer.parseInt(lineContent[2]));
    					ps.addBatch();
    				}
    			}
    			ps.executeBatch();
    		} catch (BatchUpdateException s) {
    			System.out.println("SQL statement n'est pas exécuté!");
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    	}

  17. #17
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Le plus simple serait d'aller voir directement dans ta base combien il y a d'éléments, pour vérifier si elle est bien chargée.

    As-tu vérifier que tu n'avais pas d'exception, qui pourrait être levé par Integer.parseInt.

    Tu pourrais également ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (lineContent.length == 3) {
    // ton code
    }
    else {
        System.out.println("Ligne non reconnue : " + line);
    }

  18. #18
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    De plus si tu veux faire propre, il faut fermer tes flux dans des blocs "finally" (ton prepared statement et ton bufferedReader). Voici une entrée de la FAQ qui explique comment le faire bien : Comment libérer proprement les ressources (ou comment utiliser proprement les bloc try/finally) ?

  19. #19
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 56
    Points
    56
    Par défaut
    Problème résolu. On peut barrer le sujet !!

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

Discussions similaires

  1. Jdbc & mysql. Prepared statement
    Par SyntetikSynapse dans le forum JDBC
    Réponses: 3
    Dernier message: 14/06/2012, 16h37
  2. [ASE]Grand nombre de prepared statements et commit final
    Par Hansel dans le forum Adaptive Server Enterprise
    Réponses: 2
    Dernier message: 28/11/2007, 15h42
  3. prepared statement et like %?%
    Par pigpen dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/06/2007, 14h05
  4. Prepared statement et sequence
    Par RR instinct dans le forum JDBC
    Réponses: 2
    Dernier message: 23/01/2007, 08h38
  5. Réponses: 1
    Dernier message: 12/05/2006, 17h07

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