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 filtrage par date


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Points : 64
    Points
    64
    Par défaut problème filtrage par date
    Bonjour

    J'ai un problème avec le filtrage selon les dates, en fait je veux filtrer la table femelle selon leurs dates de naissance en utilisant 2 dates quelconques (dans le code qui suit j'ai utilisé 2 date constantes juste pour vérifier si ca marche), j'ai établi ma connexion, les bloques try et catch sont bien placés tout est bon mon problème c'est dans cette partie du code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     //String req="select * from femelle where Date_naiss BETWEEN #06/01/2007# AND #06/01/2008#";
    String req="select * from femelle where Date_naiss >= #06/01/2007# AND Date_naiss<=#06/01/2008#";
    rs=stmt.executeQuery(req);
     
    while(rs.next()){
               System.out.print("id = "+rs.getLong(1)+"\t ");
               System.out.println("date naissance = "+rs.getDate(3)+"\t ");
                       }
    comme vous pouvez le voir j'ai essayé dans mon code de filtrer en utilisant 2 requêtes différentes qui donnent normalement le même résultat, le resultat obtenu est bien entendu le même pour chacune des 2 requêtes, mais le problème c'est que j'ai constaté que le résultat ne respecte pas les conditions dans la requête, y'en a un filtrage certe, mais pas le filtrage prévu!!

    Voilà là je suis vraiment bloqué, et je serai vraiment reconnaissant si on m'aide à résoudre mon problème?

    merci d'avance

  2. #2
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Points : 64
    Points
    64
    Par défaut
    j'ai oublié de préciser que ma base de données est établie avec access 2007.

    et si c'est jamais c'est util à noter, j'uilise eclipse pour developper en java.

  3. #3
    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
    Ben on ne peut pas trop t'aider là ... en tous cas c'est sûrement un problème d'origine SQL, pas de Java ...

    Tu devrais faire ta requête dans Access et une fois que tu as la bonne, tu la mets dans ton prog java ...

  4. #4
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Points : 64
    Points
    64
    Par défaut
    Bonjour ben

    merci bien pour ton intervention.

    Je viens d'écrire la requête sous access et ca donne toujours le même résultat ce qui confirme ce que vous avez dis, je vais donc poster mon problème dans le forum d'Access.

    D'autre part j'ai une autre question à propos de la connexion avec la base de données.

    En fait dans mon programme java, à chaque fois que je veux communiquer avec la base de données je procède ainsi:
    j'appel une fonction connect() dont le code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void connect(){
    	try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        }catch(ClassNotFoundException e)
        {System.out.println("impossible de charger le drivers");}
        try {
     	   final String url="jdbc:odbc:givalait";
                con=DriverManager.getConnection(url,"","");
        }catch(SQLException e)
        {System.out.println("impossible de crèer une connexion");}
    }
    après je crée ma requete et je l'éxecute, ensuite je fait appel à une fonction disconnect() dont le code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void disconnect(){
    	try   {
            stmt.close();
            con.close();
            rs.close();
    	} catch(SQLException e){}
    }
    ma méthode est-elle correcte??

  5. #5
    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
    Oui c'est correct. A part que tu n'affiches pas le message de l'exception, ou que tu les ignore carrément (disconnect)

    Par contre, si ton programme fait de nombreuses requêtes, ça va devenir pénalisant d'ouvrir/fermer la connexion à chaque fois.

    Le mieux serait d'ouvrir ta connexion une fois au début et de la fermer à la fin. après à chaque ResultSet que tu utilises, tu le fermes dès que tu n'en a plus besoin ...

    Il faut t'assurer qu'à la fin de ton programme la connexion à la base est bien close. Typiquement c'est dans un bloc finally que tu devrais appeler disconnect

  6. #6
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Points : 64
    Points
    64
    Par défaut
    Oui c'est correct. A part que tu n'affiches pas le message de l'exception, ou que tu les ignore carrément (disconnect)
    je prendrai en compte cette remarque

    Par contre, si ton programme fait de nombreuses requêtes, ça va devenir pénalisant d'ouvrir/fermer la connexion à chaque fois.
    En fait c'est exactement pour cette raison que j'ai posé ma question, effectivement mon programme a besoin de beaucoup de requêtes, et je le sens un peu lent, même si ma base est encore quasiment vide ...

    Donc si j'ai bien compris vos recommandations, dès que mon application se lance (j'utilise une interface graphique) j'appelerai la fonction connect() uniquement pour la première requête, une fois chaque requête effectuée, j'illimine l'instruction "con.close()", et je fait les 2 instructions stmt.close() et rs.close().

    l'instruction con.close() ne sera exécuté que lorsque la JFrame est fermé.

    J'attends votre confirmation, et merci beaucoup pour votre aide qui m'est très précieuse.

  7. #7
    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 master_och Voir le message
    Donc si j'ai bien compris vos recommandations, dès que mon application se lance (j'utilise une interface graphique) j'appelerai la fonction connect() uniquement pour la première requête, une fois chaque requête effectuée, j'illimine l'instruction "con.close()", et je fait les 2 instructions stmt.close() et rs.close().

    l'instruction con.close() ne sera exécuté que lorsque la JFrame est fermé.
    Oui je dirais que c'est ça. Par contre même le statement tu peux le fermer seulement à la fin. Tu peux le réutiliser pour chaque requête, à toi de voir, je ne sais pas ce qui est le mieux.

    Par contre si tu veux exécuter 2 requêtes "en même temps" il faut utiliser 2 objets statements.

    Penses aussi au PreparedStatement.
    Ca permet entre autres :
    • de réutiliser tes requêtes en ne changeant que la valeur des paramètres, ce qui accélère pas mal les choses dans ce cas (la base n'a pas besoin de recompiler ta requête)
    • de gérer les caractères spéciaux sur les paramètres de types String

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par in Voir le message
    Penses aussi au PreparedStatement.
    Ca permet entre autres :
    • de réutiliser tes requêtes en ne changeant que la valeur des paramètres, ce qui accélère pas mal les choses dans ce cas (la base n'a pas besoin de recompiler ta requête)
    • de gérer les caractères spéciaux sur les paramètres de types String
    Tu as omis le plus intéressant pour lui : les dates
    Si tu veux faire des requêtes avec des critères date, c'est incontournable (dans la mesure où tu ne peux pas être certain du format attendu sous forme String).
    Ça se ferait comme ceci :
    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
     
    Connection connection = null;
    try
    {
        connection = ...
        PreparedStatement pstmt = connection.prepareStatement("select * from MaTable where LA_DATE between ? and ?");
        pstmt.setDate(1, dateDebut);
        pstmt.setDate(2, dateFin);
        ResultSet rs = pstmt.executeQuery();
        while (rs.next())
        {
            ...
        }
    }
    catch (Exception e)
    {
    }
    finally
    {
        if (connection != null) connection.close();
    }
    dateDebut et dateFin doivent être des java.sql.Date, pas des java.util.Date, mais tu peux facilement passer de l'un à l'autre des types via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.sql.Date sqlDate = new java.sql.Date(uneUtilDate.getTime());

  9. #9
    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 OButterlin Voir le message
    Tu as omis le plus intéressant pour lui : les dates
    en plus j'y pensais en écrivant ...

    Merci

  10. #10
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 138
    Points : 64
    Points
    64
    Par défaut
    dateDebut et dateFin doivent être des java.sql.Date, pas des java.util.Date, mais tu peux facilement passer de l'un à l'autre des types via ....
    Cette remarque (qui m'a mener à effectuer une petite recherche supplémentaire sur les types date) m'a enlevé beaucoup d'ambiguité les dates, merci bien pour votre intervention.

    Par contre même le statement tu peux le fermer seulement à la fin.
    oui tout à fait je viens de vérifier mon code et ca a fonctionné parfaitement.


    Penses aussi au PreparedStatement.
    Ca permet entre autres :

    * de réutiliser tes requêtes en ne changeant que la valeur des paramètres, ce qui accélère pas mal les choses dans ce cas (la base n'a pas besoin de recompiler ta requête)
    * de gérer les caractères spéciaux sur les paramètres de types String
    En fait j'ai testé le temps de réponse des requête, en utilisant le PreparedStatement, ensuite le Statement, et dans les 2 cas j'obtiens 0 millisecondes, ce qui apparament ne donne pas un gain remarquable de temps, par contre l'utilisation du PreparedStatement me semble quand même plus pratique.

    voilà je marque le topic comme résolu, merci pour tout !

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

Discussions similaires

  1. problème filtrage par date
    Par master_och dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/04/2009, 13h55
  2. Requete : Problème de filtrage par date
    Par flamby6969 dans le forum Access
    Réponses: 1
    Dernier message: 20/12/2007, 13h29
  3. Filtrage par date
    Par zastas dans le forum Bases de données
    Réponses: 6
    Dernier message: 09/04/2006, 16h54
  4. faire un filtrage par date sur base de donnee "delphi
    Par medsoft dans le forum Bases de données
    Réponses: 7
    Dernier message: 04/02/2006, 17h03
  5. Problème classement par date
    Par Triomen dans le forum Langage SQL
    Réponses: 12
    Dernier message: 06/09/2005, 14h09

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