bonsoir les dev j'ai besoin d'une solution pour passer une date en parametre de preparedstatement
Version imprimable
bonsoir les dev j'ai besoin d'une solution pour passer une date en parametre de preparedstatement
Salut,
Utilise la méthode PreparedStatement.setDate(int, java.sql.Date). Si tu as une un java.util.Date, il faudra le convertir par new java.sql.Date(date.getTime());. Si tu as besoin de stocker un datetime, il faudra passer par un timestamp avec PreparedStatement.setTimeStamp(int, Timestamp) (conversion par new Timestamp(date.getTime()).
Si tu as un LocalDate, ou un LocalDateTime à disposition, tu as java.sql.Date.valueOf(LocalDate) ou java.sql.Timestamp.valueOf(LocalDateTime), selon, pour faire la conversion.
Oui, Joël, j'ai essayé, ça coince toujours. Je t'envoie un bout de code de ma requête :
Code:
1
2
3
4
5
6 public List<EEcole> listEcole (Date madate){ preparedstatement ps =con.preparedstatement ("select * from table where date like ?"); ps.setDate (1,madate); ...... récupérer les données. ... }
Il faut que tu sois plus précis : "ça coince" ça ne veut rien dire. Tu as un message d'erreur ? Le résultat de la requête n'est pas celui que tu attends ? Autre ?
Par ailleurs, je ne suis pas un expert SQL, mais un like sur une date, je ne pense pas que ça puisse fonctionner. Un like c'est pour chercher des chaines qui ressemblent à une autre (avec des métacaractères, comme le % et le _). Pour les dates, on fait de la comparaison (surpérieure à ou inférieure à telle date), ou on utilise un between pour chercher dans un intervalle, etc.
ok merci d'avance de prendre ton temps pour me répondre..c'est justement un betwen que jutlise au faite je veux sélectionné les achats faite entre 2date mais le blem n pa côté sql plutôt c côté java.comment préparer ma req et attendre les données saisis par le client.je fait l'appli en mvc.
Ce serait donc quelque chose comme ça :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public List<EEcole> listEcole(Connnection con, java.sql.Date debut, jave.sql.Date fin){ List<EEcole> list = new ArrayList<>(); try(Preparedstatement ps = con.prepareStatement("select * from table where date between ? and ?")) { ps.setDate (1,debut); ps.setDate (2,fin); ResultSet rs = ps.execute(); while(rs.next()) { ... = rs.get...(1); ... = rs.get...(2); ... list.add(new EEcole(...)); } return list; }
c'est justement ce que je veux et l'ai fait exactement comme ça mais ça marche pas
Et le problème c'est côté java. En sql quand je teste ça marche très bien.
"Ça ne marche pas", ça ne veut rien dire ! Il se passe quoi, ou il ne se passe pas quoi ? Il y'a un message d'erreur, quelque chose ? Est-ce qu'on peut avoir une description minimum et technique du problème ?
pas de message d'erreur pas d'exception rien du tout. attends je tenvoi toute la méthode
voici le code:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public List<EAchat> listeAchat(java.sql.Date date1,java.sql.Date date2) { List<EAchat> listP = new ArrayList<EAchat>(); Connection con=Connexion.getConnection(); try { java.sql.PreparedStatement ps = con.prepareStatement ("select * from produit p,achat a where p.id_produit=a.id_produit and DATE_ACHAT between ? and ? )"); ps.setDate(1,date1); ps.setDate(2, date2); ResultSet rs = ps.executeQuery(); while(rs.next()){ EAchat a =new EAchat(); a.setNOM_PRODUIT(rs.getString("NOM_PRODUIT")); listP.add(a); } ps.close(); } catch (Exception e) { } return listP; }
Le problème avec ton code, c'est que tu ne peux même pas savoir s'il y a une erreur ou pas, parce que ton catch est vide. On doit toujours au minimum afficher quelque chose, comme la stacktrace.
Pour les erreurs sql, on n'aura pas l'ensemble des informations utiles.Code:
1
2
3 catch (Exception e) { e.printStackTrace(); }
Par ailleurs, il faut toujours fermer les ressources qu'on ouvre après les avoir utilisées, et dans tous les cas. Ton code ferme bien les ressources ouvertes par ta requête, sauf s'il y a exception.Code:
1
2
3
4
5 catch(SQLException e) { e.printStackTrace(System.err); System.err.println("SQLState: " + e.getSQLState()); System.err.println("Error Code: " + e.getErrorCode()); }
Eventuellement, selon comment est gérée ta connexion , il faudrait appliquer le même principe. Si elle poolée (ce qui n'est pas le cas, puisqu'il n'y a pas de release dans ton code), ou singleton, ça se fera autrement. Si elle est générée à chaque appel de getConnection(), il le faut.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public List<EAchat> listeAchat(java.sql.Date date1,java.sql.Date date2) { List<EAchat> listP = new ArrayList<EAchat>(); Connection con=Connexion.getConnection(); try (java.sql.PreparedStatement ps = con.prepareStatement ("select * from produit p,achat a where p.id_produit=a.id_produit and DATE_ACHAT between ? and ? )") { // la structure try-with-ressource évite d'avoir à appeler explicitement ps.close() (qui ferme le PreparedStatement et le ResultSet associé ps.setDate(1,date1); ps.setDate(2, date2); ResultSet rs = ps.executeQuery(); while(rs.next()){ EAchat a =new EAchat(); a.setNOM_PRODUIT(rs.getString("NOM_PRODUIT")); listP.add(a); } } catch(SQLException e) { e.printStackTrace(System.err); System.err.println("SQLState: " + e.getSQLState()); System.err.println("Error Code: " + e.getErrorCode()); } return listP; }