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

avec Java Discussion :

Renvoyer valeur depuis méthode void


Sujet :

avec Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut Renvoyer valeur depuis méthode void
    Bonjour à tous,
    Je voudrais pouvoir renvoyer une valeur depuis une méthode Void, je sais que Void ne renvoie rien mais comment faire dans ce cas ?
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    public class AccessBase extends FenetrePret {
     
    	
    		public static void extraireTaux() {
    			
    			  try {
    				
    		        	Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
    				
    			      }
    			    catch (ClassNotFoundException e)
    			    {
    			    	System.out.println("// La classe n'existe pas \n");
    			    }
    			    catch (InstantiationException e)
    			    {
    			    	System.out.println("La classe est abstract ou est une interface ou n'a pas de constructeur accessible sans paramètre \n");
    			    }
    			    catch (IllegalAccessException e)
    			    {
    			    	System.out.println("// La classe n'est pas accessible \n");
    			    }
    			  try {
         			Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    			    System.out.println("Connection Etablie! \n");
    			    String catalogName =cn.getCatalog(); // cn.setCatalog("Commandes");
    			    String An=cboAnnees.getSelectedItem().toString();
    			    String sql1="Select Taux from T_Taux where Annee = ?";
    			    PreparedStatement ps=cn.prepareStatement(sql1);//Requête avec paramètres
    			    ps.setString(1,An);
    			    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
    			    
        		  while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    				}
    				rs.close();
    			  }
    			      catch (SQLException e) {
    			    	  System.out.println("Impossible de se connecter à la base");
    			     	  e.printStackTrace();
    				}
    			  
    	
    }
    C'est la valeur rs.getString(1) que je voudrais renvoyer vers la classe maitresse FenetrePret2 qui étend FenetrePret, j'ai essayé des get mais ca ne marche pas.
    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
     
    public class FenetrePret2 extends FenetrePret {
    //Constructeur
    	public FenetrePret2() {
    		cboAnnees.addActionListener(new GesListe());
    		txtTaux.setEditable(false);
    		txtTaux.setBackground(new Color(114,227,87));
    		//cmdCalculer.setVisible(false);
    		this.setTitle("Mensualité d'un prêt à taux mensuel fixe2");		
    	                      }	
    	private class GesListe implements ActionListener{//Classe Interne
    		@Override 
    		public void actionPerformed(ActionEvent e) {		
     
     
    		       AccessBase.extraireTaux();
     
    		        }                                                 }
    }
    Si quelqu'un a une idée Merci

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Non, une méthode void ne peut pas retourner de valeur. Quand on définit une méthode de type void, c'est justement qu'on ne veut pas retourner de valeur.

    Si tu fais une méthode qui doit retourner une valeur, alors donne un type de retour correspondant à cette valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static String extraireTaux() {
     
         /* ... */
         return une valeur de type String
     
    }
    Dans ton code, la valeur à retourner est obtenu via une requête SQL, ici dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    				}
    Bien sûr, on suppose que la requête retourne bien un seul résultat au plus, sinon ça n'aurait pas de sens.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     if(rs.next()) {
    			    	return rs.getString(1) ;
    }
    else {
          return null; // la requête pourrait ne retourner aucun résultat, on choisit de retourner null dans ce cas (tu pourrais retourner une valeur par défaut aussi)
    }
    Attention aussi à prévoir de retourner une valeur en cas d'erreur (null par exemple).


    En revanche, je m'interroge sur le type de taux. Est-ce vraiment String ? Pourquoi pas un numérique ?

    Ensuite, attention avec la libération des ressources (l'appel de close()). Dans ton code, en cas d'erreur, close() n'est pas appelé. Ceci pourrait causer le stockage inutile en mémoire de ressource, tant que le programme tourne. Au bout d'un moment, la mémoire pourrait être saturée. Il faut bien fermer toutes les ressources, pas seulement le ResultSet. L'appel de close() sur un Statement ferme le Statement et tous les ResultSet ouvert avec. L'appel de close() sur une Connection, ferme tous les Statement, donc aussi tous les ResultSet

    Ceci peut être éviter en utilisant une structure trt-with-resources :
    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
    31
    32
    33
    34
    35
    36
     
    public static String extraireTaux() {
     
    try {
     
    Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
     
    }
    catch (ClassNotFoundException e) {
        System.out.println("// La classe n'existe pas \n");
    }
    catch (InstantiationException e) {
    			    	System.out.println("La classe est abstract ou est une interface ou n'a pas de constructeur accessible sans paramètre \n");
    }
    catch (IllegalAccessException e) {
    			    	System.out.println("// La classe n'est pas accessible \n");
    }
    try (Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")) {
        System.out.println("Connection Etablie! \n");
        String catalogName =cn.getCatalog(); // cn.setCatalog("Commandes");
        String An=cboAnnees.getSelectedItem().toString();
        String sql1="Select Taux from T_Taux where Annee = ?";
        PreparedStatement ps=cn.prepareStatement(sql1);//Requête avec paramètres
        ps.setString(1,An);
        ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
     
        if(rs.next()) {
            return rs.getString(1);
        }
    }
    catch (SQLException e) {
        System.out.println("Impossible de se connecter à la base");
        e.printStackTrace();
    }
    return null; // en cas d'erreur ou si aucune réponse dans la requête
    }

    A noter également qu'avec un pilote de type 4 le "Class.forName" n'est pas utile pour charger le pilote. Cela allégerait ton code que de l'enlever. Et même s'il est obligatoire, tu devrais le faire dans une méthode à part, lancée au démarrage du programme, de manière à éviter de le faire à chaque fois que tu fais une requête.

    Réfléchis également au moyen de n'utiliser qu'une seule connexion, au lieu d'en créer une à chaque requête. Créer une connexion est une opération relativement lourde et consommatrice de ressource (temps, mémoire), on évite d'en créer tout le temps. On peut en conserver une utilisée par toutes les requête, ou faire un pool si on veut pouvoir faire plusieurs requêtes simultanées.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Bonjour et merci pour ton aide
    J'ai modifié la méthode et maintenant ca fonctionne
    Pour répondre à tes remarques :
    Citation Envoyé par joel.drigo Voir le message
    En revanche, je m'interroge sur le type de taux. Est-ce vraiment String ? Pourquoi pas un numérique ?
    Oui car la conversion est traitée dans la classe maitresse FenêtrePret :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    try {
    				   taux=Float.parseFloat(txtTaux.getText())/100;
    Ensuite, attention avec la libération des ressources (l'appel de close()). Dans ton code, en cas d'erreur, close() n'est pas appelé. Ceci pourrait causer le stockage inutile en mémoire de ressource, tant que le programme tourne. Au bout d'un moment, la mémoire pourrait être saturée. Il faut bien fermer toutes les ressources, pas seulement le ResultSet. L'appel de close() sur un Statement ferme le Statement et tous les ResultSet ouvert avec. L'appel de close() sur une Connection, ferme tous les Statement, donc aussi tous les ResultSet

    Ceci peut être éviter en utilisant une structure trt-with-resources :
    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
    31
    32
    33
    34
    35
    36
     
    public static String extraireTaux() {
     
    try {
     
    Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
     
    }
    catch (ClassNotFoundException e) {
        System.out.println("// La classe n'existe pas \n");
    }
    catch (InstantiationException e) {
    			    	System.out.println("La classe est abstract ou est une interface ou n'a pas de constructeur accessible sans paramètre \n");
    }
    catch (IllegalAccessException e) {
    			    	System.out.println("// La classe n'est pas accessible \n");
    }
    try (Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")) {
        System.out.println("Connection Etablie! \n");
        String catalogName =cn.getCatalog(); // cn.setCatalog("Commandes");
        String An=cboAnnees.getSelectedItem().toString();
        String sql1="Select Taux from T_Taux where Annee = ?";
        PreparedStatement ps=cn.prepareStatement(sql1);//Requête avec paramètres
        ps.setString(1,An);
        ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
     
        if(rs.next()) {
            return rs.getString(1);
        }
    }
    catch (SQLException e) {
        System.out.println("Impossible de se connecter à la base");
        e.printStackTrace();
    }
    return null; // en cas d'erreur ou si aucune réponse dans la requête
    }
    Sauf erreur j'arrive à la même écriture que toi à part le While :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public static String extraireTaux() {
     
    			  try {
     
    		        	Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
     
    			      }
    			    catch (ClassNotFoundException e)
    			    {
    			    	System.out.println("// La classe n'existe pas \n");
    			    }
    			    catch (InstantiationException e)
    			    {
    			    	System.out.println("La classe est abstract ou est une interface ou n'a pas de constructeur accessible sans paramètre \n");
    			    }
    			    catch (IllegalAccessException e)
    			    {
    			    	System.out.println("// La classe n'est pas accessible \n");
    			    }
    			  try {
         			Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    			    System.out.println("Connection Etablie! \n");
    			    String catalogName =cn.getCatalog(); 
    			    String An=cboAnnees.getSelectedItem().toString();
    			    String sql1="Select Taux from T_Taux where Annee = ?";
    			    PreparedStatement ps=cn.prepareStatement(sql1);//Requête avec paramètres
    			    ps.setString(1,An);
    			    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
        		  while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
        		  }
    			  rs.close();  		  			                  }
    			      catch (SQLException e) {
    			    	  System.out.println("Impossible de se connecter à la base");
    			     	  e.printStackTrace();
    				}
    			return null;
     
    	                                       }
    Petite question au passage : à quoi sert ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String catalogName =cn.getCatalog();
    A noter également qu'avec un pilote de type 4 le "Class.forName" n'est pas utile pour charger le pilote. Cela allégerait ton code que de l'enlever. Et même s'il est obligatoire, tu devrais le faire dans une méthode à part, lancée au démarrage du programme, de manière à éviter de le faire à chaque fois que tu fais une requête.



    Réfléchis également au moyen de n'utiliser qu'une seule connexion, au lieu d'en créer une à chaque requête. Créer une connexion est une opération relativement lourde et consommatrice de ressource (temps, mémoire), on évite d'en créer tout le temps. On peut en conserver une utilisée par toutes les requête, ou faire un pool si on veut pouvoir faire plusieurs requêtes simultanées.
    Je vais y réfléchir et je te donnerai ma solution si j'en trouve bien sûr
    Merci encore pour tes infos

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    Oui car la conversion est traitée dans la classe maitresse FenêtrePret :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    try {
    				   taux=Float.parseFloat(txtTaux.getText())/100;
    C'est plus logique de convertir la valeur au plus tôt. Avoir une méthode getTaux() qui retourne du float (ou du numérique plus généralement) est plus logique que du String qu'on convertit plus tard. En particulier si on utilise getTaux() à différents endroits.

    Citation Envoyé par xeron33 Voir le message
    Sauf erreur j'arrive à la même écriture que toi à part le While :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
    }
    est équivalent en terme d'exécution à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
    }
    mais faire une boucle pour retourner dès la première itération est moins logique que de faire un if. Une boucle c'est fait pour boucler, pas pour faire un if.

    Sinon on écrit des while chaque fois qu'on veut faire des if et le programme devient moins compréhensible.

    Mon code est différent du tien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try (Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")) {
        /* tout le début du code... */
    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
     
        if(rs.next()) {
            return rs.getString(1);
        }
    }
    catch (SQLException e) {
        System.out.println("Impossible de se connecter à la base");
        e.printStackTrace();
    }
    Ce code garantit que cn sera fermée, donc ps, donc rs, même en cas d'erreur (SQLException). Le tien non (aucune ressource n'est libérée).
    Il ne garantissait que les ressources de rs soient libérées lorsque tout se passait bien. Plus rien n'est libéré lorsque le taux est trouvé maintenant qu'il y a un return dans le while (on sort de la fonction sans passer par l'appel de rs.close()).

    Citation Envoyé par xeron33 Voir le message
    Petite question au passage : à quoi sert ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String catalogName =cn.getCatalog();
    Je ne sais pas. C'était dans ton code d'origine, je n'ai fait que copier/coller le tien.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    C'est plus logique de convertir la valeur au plus tôt. Avoir une méthode getTaux() qui retourne du float (ou du numérique plus généralement) est plus logique que du String qu'on convertit plus tard. En particulier si on utilise getTaux() à différents endroits.
    Oui mais j'ai repris une petite application crée en formation que j'essaie de faire évoluer pour ne pas perdre l'acquis, j'ai donc créer une classe fille qui hérite du code ou se trouve cette conversion(FenêtrePret) et (FenetrePret2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
    }
    est équivalent en terme d'exécution à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
    }
    mais faire une boucle pour retourner dès la première itération est moins logique que de faire un if. Une boucle c'est fait pour boucler, pas pour faire un if.

    Sinon on écrit des while chaque fois qu'on veut faire des if et le programme devient moins compréhensible.
    La aussi j'ai repris du code utilisé pour se connecter sur une base SQLServer, dans mon cas de récupération d'un taux le if est plus logique.

    Mon code est différent du tien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try (Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")) {
        /* tout le début du code... */
    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
     
        if(rs.next()) {
            return rs.getString(1);
        }
    }
    catch (SQLException e) {
        System.out.println("Impossible de se connecter à la base");
        e.printStackTrace();
    }
    Le tien non (aucune ressource n'est libérée).
    Il ne garantissait que les ressources de rs soient libérées lorsque tout se passait bien. Plus rien n'est libéré lorsque le taux est trouvé maintenant qu'il y a un return dans le while (on sort de la fonction sans passer par l'appel de rs.close()).
    La par contre j'ai pas tout compris :
    1) je ne savais pas qu'on pouvait faire fonctionner un Try comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try (Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")) {
    car si j'ai bien compris tu testes d'abord la connexion puis le reste du code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
     
        if(rs.next()) {
            return rs.getString(1);
        }
    }
    catch (SQLException e) {
        System.out.println("Impossible de se connecter à la base");
        e.printStackTrace();
    }
    2)
    Ce code garantit que cn sera fermée, donc ps, donc rs, même en cas d'erreur (SQLException).
    C'est le fait de mettre :
    [CODE]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try (Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")) {
    qui te garantie que la connexion sera fermée même en cas d'erreur?

    3) Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
        		  }
    			  rs.close();
    Tu dis :
    Le tien non (aucune ressource n'est libérée).
    Il ne garantissait que les ressources de rs soient libérées lorsque tout se passait bien.
    Là OK
    maintenant qu'il y a un return dans le while (on sort de la fonction sans passer par l'appel de rs.close()).
    Non le Close est après la boucle While.

    Et pour finir
    Je ne sais pas. C'était dans ton code d'origine, je n'ai fait que copier/coller le tien.
    Vu sur l'aide JAVA pour le GETCatalog :" Retrieves this Connection object's current catalog name." là aussi on l'avais utilisé en formation pour SQLServer pour Access je l'ai enlevé ça fonctionne
    Merci et à +

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par xeron33 Voir le message

    2)

    C'est le fait de mettre :
    [CODE]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try (Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")) {
    qui te garantie que la connexion sera fermée même en cas d'erreur?
    Oui. Cette structure s'appelle un try-with-ressource.

    Elle fonctionne pour toute instance de classe qui implémente l'interface AutoCloseable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try ( ici on met des créations d'instances de classe qui implémentent AutoCloseable) {
    }
    Lorsqu'on arrive à la fin du bloc du try-with-resources, toutes les instances AutoCloseable crées entre les paranthèses sont automatiquement fermées (leur méthode close est automatiquement appelée).

    Par exemple pour lire un fichier via un FileInputStream
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try(FileInputStream fichier = new FileInputStream(file)) {
        // lecture du flux du fichier
    }
    catch(IOException e) {
        e.printStackTrace();
    }
    S'il faut ouvrir plusieurs flux, il faudra mettre des ; à la fin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try(FileInputStream entree = new FileInputStream(filein);
    FileOutputStream sortie = new FileOutputStream(fileout);) {
        // traitement de entree et sortie
    }
    catch(IOException e) {
        e.printStackTrace();
    }
    Citation Envoyé par xeron33 Voir le message
    3) Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
        		  }
    			  rs.close();
    Tu dis :

    Là OK

    Non le Close est après la boucle While.
    Oui, mais ce n'est pas le problème. Il est surtout après un return (return (rs.getString(1));). Donc si ce return s'exécute, le rs.close() non. Le return arrête l'exécution de la méthode à l'endroit où il est. Tout le reste après n'est pas exécuté.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par joel.drigo;
    A noter également qu'avec un pilote de type 4 le "Class.forName" n'est pas utile pour charger le pilote. Cela allégerait ton code que de l'enlever. Et même s'il est obligatoire, tu devrais le faire dans une méthode à part, lancée au démarrage du programme, de manière à éviter de le faire à chaque fois que tu fais une requête.

    Réfléchis également au moyen de n'utiliser qu'une seule connexion, au lieu d'en créer une à chaque requête. Créer une connexion est une opération relativement lourde et consommatrice de ressource (temps, mémoire), on évite d'en créer tout le temps. On peut en conserver une utilisée par toutes les requête, ou faire un pool si on veut pouvoir faire plusieurs requêtes simultanées. .
    **********************************
    Bonsoir, j'ai essayé de trouver une solution mais en vain en effet je tourne en rond car je teste la connexion depuis la classe Maitresse FenetrePret2 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static boolean connect=false;
    .....
     if(connect==false) {
    		    	   AccessBase.Conn();
    		       }
    		       {
    		    	   System.out.println("Connection déjà Etablie! \n");
    		       }
    qui engendre ou appelle Conn() de la classe fille AccessBase :

    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
    31
    32
    33
    34
     
    static boolean  Conn() {
    				try {
     
    		        	Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
    		        	System.out.println("// La classe net.ucanaccess ok \n");
     
    			      }
    			    catch (ClassNotFoundException e)
    			    {
    			    	System.out.println("// La classe n'existe pas \n");
    			    }
    			    catch (InstantiationException e)
    			    {
    			    	System.out.println("La classe est abstract ou est une interface ou n'a pas de constructeur accessible sans paramètre \n");
    			    }
    			    catch (IllegalAccessException e)
    			    {
    			    	System.out.println("// La classe n'est pas accessible \n");
    			    }
     
    				try {                                     
    					Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    					System.out.println("Connection Etablie! \n");
    					connect = true;
    					return connect;
    				  }
    				  catch (SQLException e) {
    					  System.out.println("Impossible de se connecter à la base");
    				 	  e.printStackTrace();
    				 	  connect=false;
    				 	  return connect;
    				}   
    				}
    Ca ça fonctionne. Mais quand je veux faire le traitement de la requete :
    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
    public static String extraireTaux() {
    			try {
    			    String An=cboAnnees.getSelectedItem().toString();
    			    String sql1="Select Taux from T_Taux where Annee = ?";			    
    		        PreparedStatement ps=cn.prepareStatement(sql1);//Requête avec paramètres
    			    ps.setString(1,An);
    			    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
        		  while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
        		  }		
        		    } 		  			                  }
    			      catch (SQLException e) {
    			    	  System.out.println("Impossible de se connecter à la base");
    			     	  e.printStackTrace();
    				}
    		
    			return null;}
    il me renvoie l'erreur "cn cannot be resolved" sur la ligne PrepareStatement...
    En effet cn n'est pas intialisé mais l'initialiser revient à créer la connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    donc je tourne en rond. Si tu as une idée Merci

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    il me renvoie l'erreur "cn cannot be resolved" sur la ligne PrepareStatement...
    La variable cn est une variable locale, à la méthode Conn :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    Donc elle n'est pas accessible dans une autre méthode, la méthode extraireTaux.

    Tu peux tout simplement en faire une variable de classe :


    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
    31
    32
    33
    34
    35
     
    static Connection cn;
    static boolean  Conn() {
    				try {
     
    		        	Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
    		        	System.out.println("// La classe net.ucanaccess ok \n");
     
    			      }
    			    catch (ClassNotFoundException e)
    			    {
    			    	System.out.println("// La classe n'existe pas \n");
    			    }
    			    catch (InstantiationException e)
    			    {
    			    	System.out.println("La classe est abstract ou est une interface ou n'a pas de constructeur accessible sans paramètre \n");
    			    }
    			    catch (IllegalAccessException e)
    			    {
    			    	System.out.println("// La classe n'est pas accessible \n");
    			    }
     
    				try {                                     
    					cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    					System.out.println("Connection Etablie! \n");
    					connect = true;
    					return connect;
    				  }
    				  catch (SQLException e) {
    					  System.out.println("Impossible de se connecter à la base");
    				 	  e.printStackTrace();
    				 	  connect=false;
    				 	  return connect;
    				}   
    				}

    Mais, même s'il y de meilleures solutions, mais plus complexes, tu peux déjà au moins plutôt penser ta méthode comme ça (ce qui suffira si tu es en monothread :


    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
    31
    32
    33
    34
    35
    36
    37
    38
    private static Connection cn;
    public static Connection getConnection() {
       if(  cn!=null ) {
            // si on a déjà crée une connexion on la retourne
            return cn;
       }
       // sinon on en crée une
       try {
     
    		        	Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
    		        	System.out.println("// La classe net.ucanaccess ok \n");
     
    			      }
    			    catch (ClassNotFoundException e)
    			    {
    			    	System.out.println("// La classe n'existe pas \n");
    			    }
    			    catch (InstantiationException e)
    			    {
    			    	System.out.println("La classe est abstract ou est une interface ou n'a pas de constructeur accessible sans paramètre \n");
    			    }
    			    catch (IllegalAccessException e)
    			    {
    			    	System.out.println("// La classe n'est pas accessible \n");
    			    }
     
    				try {                                     
    					cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    					System.out.println("Connection Etablie! \n"); 
    				  }
    				  catch (SQLException e) {
    					  System.out.println("Impossible de se connecter à la base");
    				 	  e.printStackTrace(); 
    				}   
     
        return cn;
     
    }
    Et après, pour l'appel :

    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
    public static String extraireTaux() {
                     Connection cn = getConnection();
                     if (  cn==null ) {
                           return null;
                           // ou un throw new IllegalStateException( "Pas de connexion à la base disponible.");
                     }
     
    			    String An=cboAnnees.getSelectedItem().toString();
    			    String sql1="Select Taux from T_Taux where Annee = ?";			    
    		        try (PreparedStatement ps=cn.prepareStatement(sql1)) {//Requête avec paramètres
    			    ps.setString(1,An);
    			    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
        		                 while(rs.next()) {
    			              	System.out.println(rs.getString(1) + "\t");
    			                 return (rs.getString(1)); 
        		                }		
        		         } 		  			                  }
    			 catch (SQLException e) {
    			    	  System.out.println("Impossible de se connecter à la base");
    			     	  e.printStackTrace();
    			}
     
    			return null;}

    On pourrait s'assurer de la fermeture de la connexion à la fermeture de l'application :


    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
    try {                                     
    	 cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    	 System.out.println("Connection Etablie! \n"); 
     
     
         Runtime.getRuntime().addShutdownHook(new Thread(()-> {
    			try {
    				cn.close();
    				System.err.println("Connexion fermée avec succès");
    			}
    			catch(SQLException e) {
    				System.err.println("Connexion non fermée");
    				e.printStackTrace();
    			}
    		}));
     
     
    				  }
    				  catch (SQLException e) {
    					  System.out.println("Impossible de se connecter à la base");
    				 	  e.printStackTrace(); 
    				}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    La variable cn est une variable locale, à la méthode Conn :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    Donc elle n'est pas accessible dans une autre méthode, la méthode extraireTaux.

    Tu peux tout simplement en faire une variable de classe :

    static Connection cn;
    static boolean Conn() {

    Bonjour, désolé pour la réponse de ma part un peu lente mais absent ces jours ci ...
    Merci pour ton aide.
    J'ai donc appliqué ce que tu m'a dis mais j'ai encore deux questions :
    1)tu écris :
    Mais, même s'il y de meilleures solutions, mais plus complexes, tu peux déjà au moins plutôt penser ta méthode comme ça (ce qui suffira si tu es en monothread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private static Connection cn;
    public static Connection getConnection() {
    Sauf erreur private static Connection cn ne sert à rien car j'ai le message d'erreur "Duplicate ..."
    2)Curieusement j'ai voulu appliquer le "try-with-ressource" et sur mon code ca plante sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PreparedStatement ps=cn.prepareStatement(sql1);//Requête avec paramètres
    Si je fais un try classique ca plante pas .
    Mon code actuel :
    la Classe Maitresse (FenetrePret2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     txtTaux.setText(String.valueOf(AccessBase.extraireTaux()));
    et la classe fille :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    public class AccessBase extends FenetrePret2 {
    	static Connection cn;
     
    		public static String extraireTaux() {
    			Connection cn = getConnection();
    			try {
    			    String An=cboAnnees.getSelectedItem().toString();
    			    String sql1="Select Taux from T_Taux where Annee = ?";			    
    		        PreparedStatement ps=cn.prepareStatement(sql1);//Requête avec paramètres
    			    ps.setString(1,An);
    			    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
        		  while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
        		  }		
        		    }
    			  //rs.close();  		  			                  }
    			      catch (SQLException e) {
    			    	  System.out.println("Impossible de se connecter à la base");
    			     	  e.printStackTrace();
    				}
     
    			return null;}
    			//	private static Connection cn;
    				public static Connection getConnection() {
    			//		private static Connection cn;
    					if(  cn!=null ) {
    				        // si on a déjà crée une connexion on la retourne
    				        return cn;
    				   }
    	    			try {
     
    		        	Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
    		        	System.out.println("// La classe net.ucanaccess ok \n");
     
    			      }
    			    catch (ClassNotFoundException e)
    			    {
    			    	System.out.println("// La classe n'existe pas \n");
    			    }
    			    catch (InstantiationException e)
    			    {
    			    	System.out.println("La classe est abstract ou est une interface ou n'a pas de constructeur accessible sans paramètre \n");
    			    }
    			    catch (IllegalAccessException e)
    			    {
    			    	System.out.println("// La classe n'est pas accessible \n");
    			    }
     
    				try	{Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true"); 
    					System.out.println("Connection Etablie! \n");
    					//cn == true;
    					return cn;}
     
    				  catch (SQLException e) {
    					  System.out.println("Impossible de se connecter à la base");
    				 	  e.printStackTrace();
    				 	  cn=null;
    				 	  return cn;
    				}   
    				}

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    Sauf erreur private static Connection cn ne sert à rien car j'ai le message d'erreur "Duplicate ..."
    Dans mon code, elle est indispensable. Seulement si tu copies mon code dans le tien en gardant des parties, oui, tu peux avoir des variables dupliquées, particulier si tu laisses une déclaration de cn et tu mets la mienne en plus.
    Et puis si tu as une variable dupliquée, et ben, tu supprimes l'une des deux déclarations tout simplement.

    Citation Envoyé par xeron33 Voir le message
    2)Curieusement j'ai voulu appliquer le "try-with-ressource" et sur mon code ca plante sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PreparedStatement ps=cn.prepareStatement(sql1);//Requête avec paramètres
    "ça plante" ça ne veut rien dire. Erreur de compilation ? Erreur d'exécution ? Laquelle ?
    En plus cette ligne de code que tu cites ne figure pas dans mon exemple de code (puisque ps est crée dans la partie initialisation du "try-with-resource" (la partie entre parenthèses)).
    Maintenant si en plus du try (PreparedStatement ps=cn.prepareStatement(sql1)) { tu remets dans le bloc un PreparedStatement ps=cn.prepareStatement(sql1);, c'est sûr, ça ne peut pas compiler, puisque la variable ps est déclarée 2 fois.

    Compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    try (PreparedStatement ps=cn.prepareStatement(sql1)) {
    } catch(SQLExceptio e) {
    }

    Ne compile pas évidemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try (PreparedStatement ps=cn.prepareStatement(sql1)) {
         PreparedStatement ps=cn.prepareStatement(sql1);
    } catch(SQLExceptio e) {
    }
    Citation Envoyé par xeron33 Voir le message
    Mon code actuel :
    Ton code ne stocke jamais la connexion créée dans la variable static cn (tu n'y stocke que null en cas d'erreur à la connexion), donc ça crée une nouvelle connexion (stockée dans une variable locale) à chaque appel de getConnection(), et aucune de ces connexions n'est jamais fermée. Ni le resultset, ni le prepared statement d'ailleurs.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par joel.drigo Voir le message


    "ça plante" ça ne veut rien dire. Erreur de compilation ? Erreur d'exécution ? Laquelle ?
    En plus cette ligne de code que tu cites ne figure pas dans mon exemple de code (puisque ps est crée dans la partie initialisation du "try-with-resource" (la partie entre parenthèses)).
    Maintenant si en plus du try (PreparedStatement ps=cn.prepareStatement(sql1)) { tu remets dans le bloc un PreparedStatement ps=cn.prepareStatement(sql1);, c'est sûr, ça ne peut pas compiler, puisque la variable ps est déclarée 2 fois.

    Compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    try (PreparedStatement ps=cn.prepareStatement(sql1)) {
    } catch(SQLExceptio e) {
    }

    Ne compile pas évidemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try (PreparedStatement ps=cn.prepareStatement(sql1)) {
         PreparedStatement ps=cn.prepareStatement(sql1);
    } catch(SQLExceptio e) {
    }
    Merci pour ta réponse, ca plante en exécution j'ai repris ce que tu m'avais écris précédement et j'ai modifié ainsi :

    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
     
    public static String extraireTaux() {			
    		    	Connection cn = getConnection();
    			    String An=cboAnnees.getSelectedItem().toString();
    			    String sql1="Select Taux from T_Taux where Annee = ?";			    
    			    try (PreparedStatement ps=cn.prepareStatement(sql1)){//Requête avec paramètres
    			    ps.setString(1,An);
    			    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
        		  while(rs.next()) {
    			    	System.out.println(rs.getString(1) + "\t");
    			        return (rs.getString(1)); 
        		  }		
        		    }
    			  //rs.close();  		  			                  }
    			      catch (SQLException e) {
    			    	  System.out.println("Impossible de se connecter à la base");
    			     	  e.printStackTrace();
    				}
     
    			return null;}
    où le try du prepareStatement est en AutoCloseable là ca fonctionne si je ne mets pas le try de la connexion en AutoCloseable aussi soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    try	(Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")){ 
    					System.out.println("Connection Etablie! \n");
    					//cn == true;
    					return cn;}
     
    				  catch (SQLException e) {
    					  System.out.println("Impossible de se connecter à la base");
    				 	  e.printStackTrace();
    				 	  cn=null;
    				 	  return cn;
    				}
    Si je le mets en AutoCloseable j'ai une erreur à l'éxécution (voir l'image attachée alors que j'ai dans ma bibliothèque le fichier JAR demandé)




    de plus tu dis :
    Ton code ne stocke jamais la connexion créée dans la variable static cn (tu n'y stocke que null en cas d'erreur à la connexion), donc ça crée une nouvelle connexion (stockée dans une variable locale) à chaque appel de getConnection(), et aucune de ces connexions n'est jamais fermée. Ni le resultset, ni le prepared statement d'ailleurs.
    Pour la fermeture des connexions j'y reviendrai plus tard juste une petite précision :
    si j'ai bien compris la variable static cn c'est la variable de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class AccessBase extends FenetrePret2 {
    	static Connection cn;
    et la variable locale est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Connection cn = getConnection();
    ?

    Merci encore
    Images attachées Images attachées  

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    Merci pour ta réponse, ca plante en exécution
    Et donc, le message d'erreur est ?

    Citation Envoyé par xeron33 Voir le message
    où le try du prepareStatement est en AutoCloseable là ca fonctionne si je ne mets pas le try de la connexion en AutoCloseable aussi soit :
    Si je le mets en AutoCloseable j'ai une erreur à l'éxécution (voir l'image attachée alors que j'ai dans ma bibliothèque le fichier JAR demandé)
    [...]
    Je ne comprends pas ce que tu veux dire par "mettre en AutoCloseable". Autocloseable est une Interface implémentée par Statement (donc par PreparedStatement). C'est l'interface nécessaire qu'une classe doit implémenter pour qu'on puisse utiliser une de ses instances dans try-with-ressource. L'image que tu montres n'est pas une erreur : ça signale juste que tu n'as pas accès aux sources de la classes que tu essayes de regarder dans l'éditeur (il faut dire à Eclipse où ils se trouvent, si tant est que tu les aies). Mais y'en a pas besoin normalement. Maintenant, le souci c'est peut-être que ton pilote ucanaccess est trop vieux et que l'implémentation fourni n'implémente pas Autocloseable.

    Citation Envoyé par xeron33 Voir le message
    si j'ai bien compris la variable static cn c'est la variable de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class AccessBase extends FenetrePret2 {
    	static Connection cn;
    et la variable locale est :
    [CODE]
    Connection cn = getConnection();
    Exactement. La variable locale masque la variable static. Donc la valeur est affectée à la variable locale, mais la variable static elle n'est pas affectée par cette instruction.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Et donc, le message d'erreur est ?
    le message d'erreur est :
    net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.4 connection exception: connection does not exist
    at net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:555)
    at vaelia.application.pret.AccessBase.extraireTaux(AccessBase.java:21)
    ...
    et la ligne 21 est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     try (PreparedStatement ps=cn.prepareStatement(sql1)){//Requête avec paramètres
    mais je me répete seulement quand je code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try	(Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")){
    Je ne comprends pas ce que tu veux dire par "mettre en AutoCloseable". Autocloseable est une Interface implémentée par Statement (donc par PreparedStatement). C'est l'interface nécessaire qu'une classe doit implémenter pour qu'on puisse utiliser une de ses instances dans try-with-ressource. L'image que tu montres n'est pas une erreur : ça signale juste que tu n'as pas accès aux sources de la classes que tu essayes de regarder dans l'éditeur (il faut dire à Eclipse où ils se trouvent, si tant est que tu les aies). Mais y'en a pas besoin normalement. Maintenant, le souci c'est peut-être que ton pilote ucanaccess est trop vieux et que l'implémentation fourni n'implémente pas Autocloseable.
    Est ce que je dois implémenter AutoCloseable ?

    Exactement. La variable locale masque la variable static. Donc la valeur est affectée à la variable locale, mais la variable static elle n'est pas affectée par cette instruction.
    [/QUOTE]

    A ce sujet lors de la connexion après le try je renvoie la valeur de la connexion cn qui me renvoie la valeur locale (en mauve) quand la connexion réussie et la valeur statique (en bleue) en cas d'échec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try	(Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")){ 
    					System.out.println("Connection Etablie! \n");
    					//cn==true;
    					return cn; ici valeur locale 
    				}
    				  catch(SQLException e) {
    					  System.out.println("Impossible de se connecter à la base");
    				 	  e.printStackTrace();
    				 	  cn=null;
    				 	  return cn; ici valeur de classe 
    				}
    Tu en penses quoi ?

  14. #14
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    le message d'erreur est :
    net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.4 connection exception: connection does not exist
    at net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:555)
    at vaelia.application.pret.AccessBase.extraireTaux(AccessBase.java:21)
    ...
    Cette erreur n'a aucun rapport avec le try-with-resources, ou pas try-with-resources. Elle a un rapport avec la connexion dans la variable cn qui a été obtenue par appel de getConnection(), donc la connexion dans la variable static cn, probablement parce qu'elle n'est pas affectée (ton code affectant la variable locale mais pas la static).

    Citation Envoyé par xeron33 Voir le message
    et la ligne 21 est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     try (PreparedStatement ps=cn.prepareStatement(sql1)){//Requête avec paramètres
    mais je me répete seulement quand je code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try	(Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")){
    Qu'est-ce que c'est que cette ligne ? Elle n'est pas dans mon exemple. Si tu ouvres une connexion de cette manière, elle est locale au bloc de ce try-with-resource et fermée à la fin. Donc une nouvelle connexion à chaque fois.

    Citation Envoyé par xeron33 Voir le message
    Est ce que je dois implémenter AutoCloseable ?
    Non, nulle part.

    Citation Envoyé par xeron33 Voir le message
    A ce sujet lors de la connexion après le try je renvoie la valeur de la connexion cn qui me renvoie la valeur locale (en mauve) quand la connexion réussie et la valeur statique (en bleue) en cas d'échec



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    try	(Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")){ 
    					System.out.println("Connection Etablie! \n");
    					//cn==true;
    					return cn; ici valeur locale 
    				}
    				  catch(SQLException e) {
    					  System.out.println("Impossible de se connecter à la base");
    				 	  e.printStackTrace();
    				 	  cn=null;
    				 	  return cn; ici valeur de classe 
    				}
    Tu en penses quoi ?
    Comme je le disais juste avant, la connexion crée dans le try-with-resource est fermée à la fin de ce block, donc ça ne sert à rien de la retourner, elle est inutilisable.

    Dans mon code exemple, c'était, sous-entendu dans la méthode getConnection() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try	{ 
    					System.out.println("Connection Etablie! \n");
     
                                            cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true"); //on stocke dans cn (la static)
    				}
    				  catch(SQLException e) {
    					  System.out.println("Impossible de se connecter à la base");
    				 	  e.printStackTrace();
    				 	  cn=null; // on affecte cn (la static)
    				}   
    					return cn; // on retourne cn (la static)
    Pour reprendre en version courte on a
    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
    public static Connection getConnection() {
         if ( cn!=null ) { // si cn, la static, n'est pas  null, alors pas besoin de créer une nouvelle connexion, on retourne celle-là
              return cn; 
         }
         // sinon on crée la connexion et on la stocke dans cn (la static) pour qu'au prochain appel de getConnection() ça soit la même qui soit renvoyée
     
         // ici chargement du driver, le Class.forName tout ça
     
         // ici le code juste ci-avant
     
        try	{ 
    	System.out.println("Connection Etablie! \n");
     
            cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true"); //on stocke dans cn (la static)
        }
        catch(SQLException e) {
             System.out.println("Impossible de se connecter à la base");
    	  e.printStackTrace();
              cn=null; // on affecte cn (la static)
        }   
         return cn; // on retourne cn (la static)
     
    }
    Ainsi quand on appelle getConnection(), la première fois ça crée une connexion. Et ensuite ça retourne toujours celle qui a été créée lors du premier appel. Sauf en cas d'erreur de connexion où ça retourne null : on est dans un cas spécial, on ne peut pas accéder à la base, on ne peut pas continuer à chercher à récupérer des trucs dans la DB.

    D'où le code que je t'avais mis pour extraireTaux (j'ai ajouté des commentaires que j'ai surlignés) :
    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
    public static String extraireTaux() {
                     Connection cn = getConnection();  on appelle getConnection (ce dont je viens de parler) et je récupère la valeur retournée par cette méthode dans une variable locale (donc une connexion si tout se passe bien, et toujours la même)
                     if (  cn==null ) { // si la connexion est null, pas de DB, pas la peine de continuer ça sert à rien
                           return null;
                           // ou un throw new IllegalStateException( "Pas de connexion à la base disponible.");
                     }
    
                     et là je continue avec cn qui contient l'unique connexion, je crée le PreparedStatement, j'exécute la requête, exploite son résultat...
     
    			    String An=cboAnnees.getSelectedItem().toString();
    			    String sql1="Select Taux from T_Taux where Annee = ?";			    
    		        try (PreparedStatement ps=cn.prepareStatement(sql1)) {//Requête avec paramètres
    			    ps.setString(1,An);
    			    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB
        		                 while(rs.next()) {
    			              	System.out.println(rs.getString(1) + "\t");
    			                 return (rs.getString(1)); 
        		                }		
        		         } 		  			                  }
    			 catch (SQLException e) {
    			    	  System.out.println("Impossible de se connecter à la base");
    			     	  e.printStackTrace();
    			}
     
    			return null;}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Cette erreur n'a aucun rapport avec le try-with-resources, ou pas try-with-resources. Elle a un rapport avec la connexion dans la variable cn qui a été obtenue par appel de getConnection(), donc la connexion dans la variable static cn, probablement parce qu'elle n'est pas affectée (ton code affectant la variable locale mais pas la static).
    En effet j'ai compris maintenant 2 choses :
    1) je codais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true");
    Du coup la méthode me renvoyait la variable locale
    je code maintenant comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    try	{cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true"); 
    					System.out.println("Connection Etablie! \n");
    et la méthode me renvoit la variable de classe

    2) Au niveau de la connexion tu m'avais indiqué l'Interface AutoCloseable
    try (Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true")) {
    /* tout le début du code... */
    ResultSet rs=ps.executeQuery();//Correspond au RecordSet de VB

    if(rs.next()) {
    return rs.getString(1);
    }
    }
    Et moi j'ai voulu l'appliquer qu'à la connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    try (Connection cn=DriverManager.getConnection("jdbc:ucanaccess://d:/Access/BaseJAVA/JAVA.accdb;openExclusive=false;ignoreCase=true"))
    et en effet comme tu dis
    Si tu ouvres une connexion de cette manière, elle est locale au bloc de ce try-with-resource et fermée à la fin. Donc une nouvelle connexion à chaque fois.
    Merci pour tout je vais voir maintenant les fermetures de connexion

  16. #16
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    2) Au niveau de la connexion tu m'avais indiqué l'Interface AutoCloseable
    Je t'ai juste dit, quand je t'expliquais le try-with-resource, que, en effet, le try-with-resource fonctionne pour toute classe qui implémente Autocloseable.

    Citation Envoyé par joel.drigo Voir le message
    Oui. Cette structure s'appelle un try-with-ressource.

    Elle fonctionne pour toute instance de classe qui implémente l'interface AutoCloseable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try ( ici on met des créations d'instances de classe qui implémentent AutoCloseable) {
    }
    Lorsqu'on arrive à la fin du bloc du try-with-resources, toutes les instances AutoCloseable crées entre les paranthèses sont automatiquement fermées (leur méthode close est automatiquement appelée).
    Je ne t'ai pas dit qu'il fallait implémenter. Si je t'ai suggéré d'utiliser un try-with-resource, c'est parce que je savais que tu pourrais l'utiliser. Et si tu veux savoir si tu peux utiliser une classe existante dans un try-with-resource, il suffit de regarder la doc de la classe.

    Par exemple, si tu te dis est-ce que je pourrais utiliser un java.io.FileInputStream dans un try-with-resource. Et bien go to la JavaDoc de FileInputStream et :

    Nom : Capture.JPG
Affichages : 1556
Taille : 56,2 Ko

    On voit que c'est bien AutoCloseable. Donc on peut l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try(FileInputStream input = new FileInputStream("bidule/machin.truc")) {
     
    }
    catch(IOException e) {
    }
    On peut l'implémenter aussi si on a envie ou besoin, dans ses propres classes, mais c'est une autre histoire.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    899
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 899
    Par défaut
    Bsr joel.drigo;

    ***********************************************
    Bonsoir et encore merci pour toutes tes infos bien utiles

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

Discussions similaires

  1. Récupérer les valeurs d'une méthode void
    Par whereistheshop dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 24/04/2017, 12h41
  2. Valeur renvoyé par une méthode et exceptions
    Par koktel_dfr dans le forum C#
    Réponses: 4
    Dernier message: 16/05/2008, 11h48
  3. [AJAX] Retour de valeur depuis le JS
    Par lodan dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/10/2006, 08h13
  4. [SQL] Affichage d'une valeur depuis une requête
    Par kitty2006 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 19/09/2006, 16h38
  5. Passage valeure depuis un popup
    Par krfa1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/12/2005, 13h08

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