Accéder à une base de données sous Access en Java [Résolu]

Signaler
-
 avridhe -
Je sollicite votre aide car cela fait une bonne semaine que je bataille. J'ai même essayé le programme que vous fournissez en vain. Ci joint mon dernier essai, pour lequel je reçois comme réponse :
Pilote chargé
ERREUR : bd manquante ou connexion invalide.

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Bdd {

     
 public static void main(String[] args) {
  
  String dbUrl = "jdbc:E:\\Personnel\\ Base de données\\ Gestion locative.accdb" ; 
   String usager ="";
    String motdepasse = "";
    
  try {
  Class.forName ("java.sql.DriverManager");
  System.out.println("Pilote chargé");
  }
  catch(ClassNotFoundException cnfe) {
  System.out.println("ERREUR : Driver manquant.");
  } 

  try
  {
  Connection connect  = DriverManager.getConnection(dbUrl, usager, motdepasse);
  
  System.out.println("connécté");
  }
  catch (SQLException se)
  {
  System.out.println("ERREUR : bd manquante ou connexion invalide.");
  }
 }

}

7 réponses

Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021
121
Bonjour,

Il ne faut pas masquer les exceptions sinon quand tu as un problème tu es incapable de savoir ce qu'il se passe...

Modifies donc tes try/catch pour que les exceptions se propagent, puisque de toute façon tu ne pourras rien faire sans base de données...

package jdbc;
import java.sql.*;
public class Bdd {
    public static void main(String[] args) throws Exception {
        Class.forName("java.sql.DriverManager");
        System.out.println("Pilote chargé");

        String dbUrl = "jdbc:E:\\Personnel\\Base de données\\Gestion locative.accdb";
        String usager = "";
        String motdepasse = "";
        Connection connect = DriverManager.getConnection(dbUrl, usager, motdepasse);
        System.out.println("Connexion ouverte");

        connect.close();
        System.out.println("Connexion fermée");
    }
}

Une fois que tu auras un beau message d'erreur complet, tu pourras le lire pour savoir d'où vient le problème.
Merci infiniment, mais ça ne marche pas. J'ai reproduit la correction que vous avez bien voulu m'envoyer dans une nouvelle classe Bdd9.
Voici donc le message d'erreur que je reçois :
Error: Could not find or load main class jdbc.Bdd9
Caused by: java.lang.ClassNotFoundException: jdbc.Bdd9 </gras></gras>
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021
121 > avridhe
Au lieu d'avancer dans ton problème, tu recules, ton programme n'est même plus démarré...
Il faut que ta nouvelle classe Bdd9 soit public, avec une méthode main, écrite dans un fichier Bdd9.java, compilée et que son exécution soit faite en haut du package jdbc.
Bref, tout pareil qu'avec la classe Bdd mais avec Bdd9.
Messages postés
1784
Date d'inscription
vendredi 9 mai 2008
Statut
Modérateur
Dernière intervention
28 avril 2021
131
Merci pour l'attention que tu accordes à mon problème....Mais ça ne marche toujours pas. J'ai pourtant copié collé ton première envoi
que voici ;
package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
 
public class Bdd9 {
     
     public static void main(String[] args) throws Exception {
      
   Class.forName("java.sql.DriverManager");
         System.out.println("Pilote chargé");

         String dbUrl = "jdbc:E:\\Personnel\\Base de données\\Gestion locative.accdb";
         String usager = "";
         String motdepasse = "";
         Connection connect = DriverManager.getConnection(dbUrl, usager, motdepasse);
         System.out.println("Connexion ouverte");

         connect.close();
         System.out.println("Connexion fermée");
     }
 }

je reçois comme réponse :
Error: Could not find or load main class jdbc.Bdd9
Caused by: java.lang.ClassNotFoundException: jdbc.Bdd9

Pourtant il y a le main et la classe est déclarée public. Et c'est compilé automatiquement. J'avoue que je n'y comprends rien d'autant plus que je suis débutant en Java
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021
121
"Et c'est compilé automatiquement."
Par quelle magie ? Tu utilises un IDE ? Lequel ? Comment tu t'en sers ? etc.
Là le problème ne vient pas du code, tu pourrais avoir un simple HelloWorld que ça ne fonctionnerait pas non plus, là Java ne trouve pas ton programme compilé, comme s'il n'y avait aucun code.
Bonsoir, j'avais installé Eclipse 2020 09 mais là il m'affiche 2020 12.
Dans le menu projet j'ai bien coché compilé automatiquement.
Et je viens de tester un programme sur les "listener" il tourne normalement.
J'ai aussi installé Eclipse papyrus. Là il m'avait demandé de mettre à jour Java je l'ai fait.
J'utilise Java SE 14.
J'ai un espace de travail que je lance à l'ouverture d'Eclipse.
Désolé de vous déranger mais là je suis perdu......Merci de m'informer si vous avez une solution
Bonjour, il y a un peu de nouveau :
1 pour le simple Hello Word je reçois en effet la même chose; soit :
package jdbc;

public class Hello {

 public static void main(String[] args) {
  System.out.println("Bonjour");

 }

}

Error: Could not find or load main class jdbc.Hello
Caused by: java.lang.ClassNotFoundException: jdbc.Hello

2 Mais pour ma toute première tentative que j'ai modifiée grâce à vos pertinentes remarques, j'ai la situation suivante :

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;

public class Bdd {

 public static void main(String[] args) throws Exception{
  
 String dbUrl = "jdbc:E:\\Personnel\\ Base de données\\ Gestion locative.accdb" ; 
   String usager ="";
    String motdepasse = "";
     // try {
  Class.forName ("java.sql.DriverManager");
  //System.out.println("Pilote chargé");
  //}
  //catch(ClassNotFoundException cnfe) {
  System.out.println("ERREUR : Driver manquant.");
  //} 

  //try
  //{
  Connection connect  = DriverManager.getConnection(dbUrl, usager, motdepasse);
  
  System.out.println("connécté");
  //}
  //catch (SQLException se)
  //{
 // System.out.println("ERREUR : bd manquante ou connexion invalide.");
  //}
   connect.close();
         System.out.println("Connexion fermée");
 }

}

je reçois :
Pilote chargé
ERREUR : bd manquante ou connexion invalide.

Alors que ces lignes sont sous forme de commentaire.
Je me démène comme je peux mais.....En tous cas merci
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021
121
Si tu as encore "ERREUR : bd manquante ou connexion invalide." alors que le code est commenté c'est que tu n'as pas recompilé, tu exécutes une ancienne version du code.

Remarque : Eclipse Papyrus pour un débutant ça ne sert à rien, et comme visiblement tu as un problème avec ton installation d'Eclipse, je te conseille de tout désinstaller, à la limite même Java 14 qui est déprécié, soit tu utilises une LTS (Java 11), soit la toute dernière version (Java 15) mais pas les versions intermédiaires.

Les liens pour réinstaller :
Bonjour, l'erreur à commencé à apparaître lorsque j'avais essayé un prg qui n'a pas de "main". Là j'ai exécuté les configurations....avec ce résultat catastrophique. Mais je ne lâche pas.
J'ai supprimé Eclipse papyrus. Je l'ai comme plug in.
J'ai essayé de compiler avec l'invite de commande bin\javac Bdd, mais il me demande le chemin explicite de cette classe.
Le JDK que j'avais installé est SEE 15. qui contient un JRE et la JVM.
Voilà, je termine en vous remerciant et en vous souhaitant un Joyeux noël et de bonnes fêtes de fin d'année.
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021
121
"l'erreur à commencé à apparaître lorsque j'avais essayé un prg qui n'a pas de "main""
Un programme Java doit nécessairement avoir une méthode main, c'est le point d'entrée de son exécution.
C'est ce que j'avais précisé dans un message précédent :
"Il faut que ta nouvelle classe Bdd9 soit public, avec une méthode main, écrite dans un fichier Bdd9.java, compilée et que son exécution soit faite en haut du package jdbc."

"avec l'invite de commande bin\javac Bdd, mais il me demande le chemin explicite de cette classe."
C'est pour cela que l'on rajoute généralement le répertoire bin de Java au Path Windows, pour pouvoir exécuter appeler les commandes Java et javac depuis n'importe quel dossier, celui qui contient le code source.
https://www.java.com/fr/download/help/path.html
>
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021

J'ai contourné le problème en supprimant le projet y compris sur disque dur. J'ai créé un nouveau (Le même que le précédent) mais que j'ai appelé Base. Voici le programme et la réponse après exécution :
package base;

import java.sql.Connection;
import java.sql.DriverManager;

public class Bdd {

 public static void main(String[] args) throws Exception {

  String dbUrl = "jdbc:odbc: E:\\Personnel\\ Base de données\\ Gestion locative.accdb";
  String usager = "";
  String motdepasse = "";
  // try {

  Class.forName("java.sql.DriverManager");

  // System.out.println("Pilote chargé");
  // }
  // catch(ClassNotFoundException cnfe) {
  // System.out.println("ERREUR : Driver manquant.");
  // }

  // try
  // {
  Connection connect = DriverManager.getConnection(dbUrl, usager, motdepasse);

  System.out.println("connécté");
  // }
  // catch (SQLException se)
  // {
  // System.out.println("ERREUR : bd manquante ou connexion invalide.");
  // }
  connect.close();
  System.out.println("Connexion fermée");
 }

}

réponse :
Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:odbc: E:\Personnel\ Base de données\ Gestion locative.accdb
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at base.Bdd.main(Bdd.java:25)

Je comprends que le driver n'est pas approprié. Que faire ? Et merci encore une fois.
Nb : Je vous transmettrais le prg "coupable" qui est sans méthode 'main'. Méthode qu'il refuse après l'appel de la classe.
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021
121 > avridhe
D'une part la valeur de dbUrl est fausse car il ne devrait pas y avoir d'espace entre odbc: et E:
D'autre part, depuis Java 8, le Driver java.sql.DriverManager ne gère plus le protocole odbc.
Vu que tu es en Java 14 il faudrait donc passer par un driver tiers comme UCanAccess qu'il faudra ajouter au classpath d'exécution.

Et bien sûr adapter ton code à ce changement :
String dbUrl = "jdbc:ucanaccess://e:/Personnel/Base de données/Gestion locative.accdb";
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Bonjour, avant tout encore une fois MERCI.
J'ai téléchargé UCanaccess-5.0.0-bin que j'ai placé dans les dossiers JDK et Base de données mais hélas ça ne marche toujours pas.
Ci suit le prg et la réponse :

package base;

import java.sql.Connection;
import java.sql.DriverManager;

public class Bdd2 {

 public static void main(String[] args) throws Exception {

  String dbUrl = "jdbc:ucanaccess:\\E:\\Personnel\\Base de données\\Gestion locative.accdb";
  String usager = "";
  String motdepasse = "";

  Class.forName("net.Ucanaccess.jdbc.UcanaccessDriver");

  Connection connect = DriverManager.getConnection(dbUrl, usager, motdepasse);

  System.out.println("connécté");

  connect.close();
  System.out.println("Connexion fermée");
 }

}

Et la réponse :
Exception in thread "main" java.lang.ClassNotFoundException: net.UCanaccess.jdbc.UCanaccessDriver
 at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
 at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
 at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
 at java.base/java.lang.Class.forName0(Native Method)
 at java.base/java.lang.Class.forName(Class.java:340)
 at base.Bdd2.main(Bdd2.java:14)
>
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021

Bonjour,
j'ai mis les cinq .jar comme préconisé dans ta précieuse aide. Il a été crée une librairie référencie dans le projet Base de données avec tous les éléments rajoutés au classpath du projet. Mais mille fois hélas ça ne marche toujours pas. Le prg étant toujours le même la réponse est :
Exception in thread "main" java.lang.ClassNotFoundException: net.ucAnaccess.jdbc.UcanAccessDriver
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:340)
at base.Bdd2.main(Bdd2.java:14)
Le driver pose toujours problème.
Merci
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021
121 > avridhe
Parce que tu ne sais pas faire un copier-coller...

Dans ton code d'hier tu avais "net.Ucanaccess.jdbc.UcanaccessDriver"
Dans ton exception d'hier tu avais "net.UCanaccess.jdbc.UCanaccessDriver"
Dans ton exception aujourd'hui tu as "net.ucAnaccess.jdbc.UcanAccessDriver"

Mais ce que j'ai marqué, et ce que tu devrais avoir, c'est "net.ucanaccess.jdbc.UcanaccessDriver"
Voir la documentation : http://ucanaccess.sourceforge.net/site.html#examples
>
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021

Bonsoir, décidemment je n'avance pas, et désolé d'abuser de votre patience . Voici le programme tel qu'il est maintenant :

package base;

import java.sql.Connection;
import java.sql.DriverManager;

public class Bdd2 {

 public static void main(String[] args) throws Exception {

  String dbUrl = "jdbc:ucanAccess:\\E:\\Personnel\\Base de données\\Gestion locative.accdb";
  String usager = "";
  String motdepasse = "";

  Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");

  Connection connect = DriverManager.getConnection(dbUrl, usager, motdepasse);

  System.out.println("connécté");

  connect.close();
  System.out.println("Connexion fermée");
 }

}

avec comme réponse :
Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:ucanAccess:\E:\Personnel\Base de données\Gestion locative.accdb
 at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
 at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
 at base.Bdd2.main(Bdd2.java:16)

Là je pense, que ça s'améliore car il y a moins d'exception.

Je vais essayer de décortiquer la documentation.
Merci et mes meilleurs veux pour la nouvelle année à vous et à toute l'équipe de "Code Sources.
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021
121 > avridhe
Je pense que dbUrl est faux, il faudrait le réécrire comme je l'avais mis dans mon exemple (qui reprend ce qui est dit dans la documentation)
String dbUrl = "jdbc:ucanaccess://e:/Personnel/Base de données/Gestion locative.accdb";
>
Messages postés
16358
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 juin 2021

Bonsoir, en effet j'ai corrigé et j'obtiens comme réponse :
connécté
Connexion fermée

Et le travail ne fait que commencer
Merci et bonne année