Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre du Club
    Homme Profil pro Alf Cedano
    Inscrit en
    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 : 51
    Points
    51

    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.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    1 331
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : janvier 2007
    Messages : 1 331
    Points : 1 452
    Points
    1 452

    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
    Program manager chez TraceOne. http://www.traceone.com

  3. #3
    Membre du Club
    Homme Profil pro Alf Cedano
    Inscrit en
    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 : 51
    Points
    51

    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 :
    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.

  4. #4
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2007
    Messages : 21 344
    Points : 35 093
    Points
    35 093

    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é.
    Tchize (Чиз) 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.

  5. #5
    Membre du Club
    Homme Profil pro Alf Cedano
    Inscrit en
    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 : 51
    Points
    51

    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 :
    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.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    1 331
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : janvier 2007
    Messages : 1 331
    Points : 1 452
    Points
    1 452

    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)
    Program manager chez TraceOne. http://www.traceone.com

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •