Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > JDBC
JDBC Forum d'entraide sur l'API JDBC (Java Database Connectivity) et l'accès aux bases de données. Avant de poster -> FAQ JDBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/01/2013, 13h10   #1
alfhcg
Membre du Club
 
Homme Alf Cedano
Inscription : septembre 2010
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme Alf Cedano
Localisation : France, Cher (Centre)

Informations forums :
Inscription : septembre 2010
Messages : 116
Points : 54
Points : 54
Par défaut Problème avec date Postgresql

Bonjour à tous et bonne année!

Je viens vers vous car je bloque depuis hier.

J'essai de vérifier si une personne existe dans ma base de données Postgresql pour cela je dois vérifier trois colonnes de la base (nom, prénom et datenaissance), j'ai donc une fenêtre où je récupère nom, prénom et datenaissance de la personne, puis je construis une requête:


SELECT idpersona FROM tpersonas where nom= 'A' and prenom= 'B' and datenaissance= '22/08/1972'

J'ai droit à l'erreur:
Code :
1
2
org.postgresql.util.PSQLException: ERROR: date/time field value out of range: "22/08/1972"
  Indice*: Perhaps you need a different "datestyle" setting.
Postgresql travaille avec un format de dates: 'yyyy-MM-dd', mais moi, dans mon JTextField j'utilise: 'dd/MM/yyyy'

Voici mon JTextField:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
		    final DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
 
			JFormattedTextField fechan = new JFormattedTextField(df);
			fechan.setName("datenaissance");
			//JTextField fechan = new JTextField();
			this.add(datenaissance,"2, 6, fill, default");
		        try {
		            MaskFormatter dateMask = new MaskFormatter("##/##/####");
		            dateMask.install(datenaissance);
		        } catch (ParseException ex) {
		            Logger.getLogger(this.getName()).log(Level.SEVERE, null, ex);
		        }
Comment contourner ce problème? Si j'execute ma requête dans PgAdmin je n'ai pas d'erreur.

Merci si quelqu'un me donne une idée.
alfhcg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h51   #2
chtig
Membre Expert
 
Inscription : janvier 2007
Messages : 1 331
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 331
Points : 1 561
Points : 1 561
Jette un coup d'oeil à la classe SimpleDateFormat. Elle te permet de formater des dates en texte et inversement de parser du texte en date.
Pour ce qui est ensuite de faire la requête, je te conseille d'utiliser des PreparedStatement pour injecter tes valeurs, au lieu de construire ta requête SQL par concaténation.
Ca te permettrait :
- D'être indépendant de la base de donnée et de son format
- D'éviter toute injection SQL
__________________
Program manager chez TraceOne. http://www.traceone.com
chtig est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 18h16   #3
alfhcg
Membre du Club
 
Homme Alf Cedano
Inscription : septembre 2010
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme Alf Cedano
Localisation : France, Cher (Centre)

Informations forums :
Inscription : septembre 2010
Messages : 116
Points : 54
Points : 54
Merci pour la reponse chtig,

J'ai beaucoup lu sur SimpleDateFormat et j'ai fait plusieurs essais, mais toujours le même problème.

Quant à ma chaîne SQL une fois generéé j'interroge la base de données par un PreparedStatement. Par exemple:

Code :
1
2
 
strSQL="SELECT idpersona FROM tpersonas where nom= 'A' and prenom= 'B' and datenaissance= '22/08/1972'"
Puis j'utilise une méthode (siExiste) pour vérifier:
Code :
1
2
3
4
5
6
7
 
if (db.siExiste(strSQL)==true) {
//Message de doublon
}
else{
//Suit le code pour insérer la personne
}
Et voici le code de la méthode pour vérifier si la personne existe:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
	public boolean siExiste (String strSQL){
 
			try{
				PreparedStatement stmt = cnx.prepareStatement(strSQL);
				ResultSet rs=stmt.executeQuery();
				if (!rs.next() ) {
					return false;}
				else{
					return true;}
				}
				catch(SQLException e){
					e.printStackTrace();}
				finally {}					
//				dbCerrar (rs, stmt, cnx);}
				return false;
				}
Ici je ne veux rien insérer, juste vérifier si la personne existe avant de l'insérer.
alfhcg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 18h38   #4
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 412
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 412
Points : 33 154
Points : 33 154
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
Comment passer/vider les paramètres du PreparedStatement(IN parameters) ?

Tu utilise les méthode setDate de ton preparedStatement et le tour est joué.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 23h20   #5
alfhcg
Membre du Club
 
Homme Alf Cedano
Inscription : septembre 2010
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme Alf Cedano
Localisation : France, Cher (Centre)

Informations forums :
Inscription : septembre 2010
Messages : 116
Points : 54
Points : 54
Re-bonjour,

J'ai trouvé une solution, il fallait convertir ma date saisie dans le JTextField en format (dd/MM/yyyy) pour le format (yyyy-MM-dd) pour ensuite envoyer la requête au SGDB, en faisant quelque chose comme cela:
Code :
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
 
import java.text.ParseException;
import java.text.SimpleDateFormat;
 
public class TestDate {
 
	public static void main(String[] args) {
		AdminBD db =  new AdminBD();
 
		final SimpleDateFormat sdfYYMMDD = new SimpleDateFormat("yyyy-MM-dd");
		final SimpleDateFormat sdfDDMMYY = new SimpleDateFormat("dd/MM/yyyy");
 
		java.util.Date javaDate = new java.util.Date();
 
		try {
			javaDate = sdfDDMMYY.parse("22/08/1972"); //22/08/1972 ou n'importe quelle date prise dans un JTextField (txtDate.getString())
		} catch (ParseException e) {
			e.printStackTrace();
		}
 
		java.sql.Date sqlDate = new java.sql.Date(javaDate.getTime());
 		String strSQL="SELECT idpersona FROM tpersonas where prenom= 'A' and nom= 'B' and datenaissance= '"+sdfYYMMDD.format(sqlDate) +"'";
		if (db.siExiste(strSQL)==true) {
			//Informer que la personne existe
}
		else{//Ajouter la personne
} 
	}
 
}
Pour insérer dans ma base de données:
Je recupère les valeurs de mes JTextFields dans un Map appelé "key", que je lis ainsi pour préparer mon Statement:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
			int x =1;
			for (Entry<String, String> a : key.entrySet()){					
				if (a.getKey()=="datenaissance"){
//Pas de souci pour utiliser .valueOf, parce que lorsque on est arrivé ici 
//la date inserée dans le JTextField a été vérifié comme une date valide avec DateValidator...
					stmtInsert.setDate(x,  java.sql.Date.valueOf(a.getValue()));
				}
				else{
				stmtInsert.setString(x, a.getValue());
					}
				x++;}
J'ai donc résolu mon problème. Merci beaucoup pour les pistes données.
alfhcg est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/01/2013, 11h25   #6
chtig
Membre Expert
 
Inscription : janvier 2007
Messages : 1 331
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 331
Points : 1 561
Points : 1 561
Effectivement, cela fonctionne, mais je te conseille de regarder tout de même le lien donné sur l'utilisation de PreparedStatement et l'injection de paramètre. C'est la méthode recommandée !! (cf raisons évoquées précédemment)
__________________
Program manager chez TraceOne. http://www.traceone.com
chtig est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h14.


 
 
 
 
Partenaires

Hébergement Web