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 :

Problème avec date Postgresql


Sujet :

JDBC Java

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Points : 88
    Points
    88
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    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

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Points : 88
    Points
    88
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    	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.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Comment passer/vider les paramètres du PreparedStatement(IN parameters) ?

    Tu utilise les méthode setDate de ton preparedStatement et le tour est joué.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Points : 88
    Points
    88
    Par défaut
    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 : 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
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    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)

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

Discussions similaires

  1. [Dates] problème avec date et mktime
    Par gloubi dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2007, 17h59
  2. [Dates] Problème avec date (heure qui varie)
    Par Death83 dans le forum Langage
    Réponses: 10
    Dernier message: 05/08/2006, 02h19
  3. Problème avec date dans requête
    Par alain94 dans le forum Access
    Réponses: 2
    Dernier message: 22/05/2006, 07h49
  4. Problème avec "Date()" en mode runtime
    Par bwalbourg dans le forum Runtime
    Réponses: 1
    Dernier message: 25/01/2006, 10h51
  5. [MySQL] Problème avec DATE SUB et INTERVAL
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/01/2006, 00h36

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