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 :

SOS connexion à une base de données Ms Access 2010


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 105
    Par défaut SOS connexion à une base de données Ms Access 2010
    Salut.

    Je voudrais réaliser un programme Java qui enregistre des noms de personnes dans une base de données Access.
    Mais je rencontre des erreurs donc j'aimerais avoir de l'aide. Voici le plan de mon programme sous NetBeans :
    Nom : Capture.PNG
Affichages : 1023
Taille : 11,4 Ko

    et voici mes 3 classes :
    1) TestAccess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class TestAccess {
     
        public static void main(String[] args) throws SQLException {
            String nom = "", prenom = ""; 
            int age = 0;
            Personne pers = new Personne(nom, prenom, age);
            pers.saisie();
             MSAccessBase db = new  MSAccessBase("c:\\Users\\KABRE\\Documents\\TestAccessDB.accdb", "KABRE", "");
            String rq = "insert into personne values ('"+pers.getNom()+"', '"+pers.getPrenom()+"', '"+pers.getAge()+"')";
            db.SQLUpdate(rq);
        }
    }
    2) Personne
    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
     
    public class Personne {
        private String nom;
        private String prenom;
        private int age = 0;
     
        // definition du condtructeur
        public Personne(String n, String p, int a)
        {
            this.nom = n;
            this.prenom = p;
            this.age = a;
        }
     
        // definition des accesseurs
        public String getNom()
        {
            return this.nom;
        }
        public String getPrenom()
        {
            return this.prenom;
        } 
            public int getAge()
        {
            return this.age;
        }
        // une opreration de classe
        public void saisie()
        {
            Scanner sc = new Scanner(System.in);
     
                System.out.println("Saisir Nom___________________________: ");
                String nom1 = sc.nextLine();
                sc.nextLine();
                System.out.println("Saisir Prenom________________________: ");
                String prenom1 = sc.nextLine();
                System.out.println("Saisir Age:__________________________: ");
                int age1 = sc.nextInt();
                System.out.println("--------------- Fin Entrée ---------------------"); 
        }
    }
    3) MSAccessBase
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    public class MSAccessBase {
     
        // Chemin de la base
        private String path;
     
        // Nom d'utilisateur
        private String user;
     
        // Mot de passe
        private String password;
     
        // Connection vers la base
        private Connection connection;
     
     
        /* Constructeur */
        public MSAccessBase(String path, String user, String password) {
            this.path = path;
            this.user = user;
            this.password = password;
        }
     
     
        /*
        *Connection à la base
        *@return : true si la connexion est réussie, false si échouée
        */
        public boolean connect() {
            try {
                // Chargement du driver ODBC
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     
                // Connexion à la base
                String connectionString = "jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" + path;
                connection = DriverManager.getConnection(connectionString, user, password);
            }
            catch (ClassNotFoundException e) {
                System.out.println("Problème avec le driver ODBC");
                return false;
            }
            catch (SQLException e) {
                System.out.println("Impossible de se connecter à la base");
                return false;
            }
            return true;
        }
     
     
        /*
        *Déconnexion de la base
        *@return : true si la déconnexion est réussie, false sinon
        */
        public boolean disconnect() {
            try {
                connection.close();
                return true;
            }
            catch (SQLException e) {
                return false;
            }
        }
     
        /*
        *Envoi d'une requête de sélection
        *@param : sql
        *@return : result
        */
        public ResultSet SQLSelect(String sql) throws SQLException {
            Statement statement = null;
            ResultSet result = null;
            try {
                statement = connection.createStatement();
                result = statement.executeQuery(sql);
                return result;
            }
            catch (SQLException e) {
                result.close();
                statement.close();
                return null;
            }
        }
     
        /*
        *Envoi d'une requête de mise à jour (insert, update, delete)
        *@param : sql
        */
        public void SQLUpdate(String sql) throws SQLException {
            Statement statement = null;
            try {
                statement = connection.createStatement();
                statement.executeUpdate(sql);
            }
            catch (SQLException e) {
     
            }
        }  
    }
    et voici l'erreur:
    Exception in thread "main" java.lang.NullPointerException
    at testaccess.MSAccessBase.SQLUpdate(MSAccessBase.java:99)
    at testaccess.TestAccess.main(TestAccess.java:17)
    C:\Users\KABRE\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
    BUILD FAILED (total time: 13 seconds)
    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Tu as instancié un MSAccessBase à cette ligne MSAccessBase db = new MSAccessBase("c:\\Users\\KABRE\\Documents\\TestAccessDB.accdb", "KABRE", "");, mais quand tu appelles la méthode SQLUpdate(String sql), l'attribut connection est encore nul à cette ligne statement = connection.createStatement();, d'où l'exception "java.lang.NullPointerException"

    Ensuite, ça ne sert à rien de propager une exception avec throws SQLException si tu le captures déjà dans la méthode avec catch (SQLException e).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String rq = "insert into personne values ('"+pers.getNom()+"', '"+pers.getPrenom()+"', '"+pers.getAge()+"')";
    Si t'as une valeur avec un guillemet simple, t'auras une erreur, utilise une requête préparée.

    A+.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 105
    Par défaut
    ok en tentant de résoudre ça
    l'exception "java.lang.NullPointerException"
    j'ai rajouté
    db.connect(); juste avant db.SQLUpdate(rq).
    Et pour l'utilisation du preparedStatement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     public void SQLUpdate(String sql) throws SQLException {
            //Statement statement = null;
            PreparedStatement pst = null;
            try {
               // statement = connection.createStatement();
                //statement.executeUpdate(sql);
                pst = connection.prepareStatement(sql);
                pst.executeUpdate();
            }
            catch (SQLException e) {
     
            }
        }
    Mais ça renvoie toujours une erreur :
    Problème avec le driver ODBC
    Exception in thread "main" java.lang.NullPointerException
    at testaccess.MSAccessBase.SQLUpdate(MSAccessBase.java:108)
    at testaccess.TestAccess.main(TestAccess.java:18)
    C:\Users\KABRE\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
    BUILD FAILED (total time: 7 seconds)

  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 : 56
    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 Toogda Voir le message
    Mais ça renvoie toujours une erreur :
    Problème avec le driver ODBC
    Ce que j'ai souligné en jaune et qui s'affiche dans ta console, c'est le message que tu affiches ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch (ClassNotFoundException e) {
                System.out.println("Problème avec le driver ODBC");
                return false;
            }
    Parce que la classe de driver n'est pas trouvée, donc la variable connection n'est pas initialisée et reste à null. Tant que tu n'as pas résolu le premier problème, l'autre arrivera toujours.

    Et la classe sun.jdbc.odbc.JdbcOdbcDriver n'est pas trouvée parce qu'elle n'est plus supportée par Java 8 (ni ODBC over JDBC).

    Il te faut utiliser à la place un autre moyen d'accès, comme la bibliothèque ucanaccess.
    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
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Et la classe sun.jdbc.odbc.JdbcOdbcDriver n'est pas trouvée parce qu'elle n'est plus supportée par Java 8 (ni ODBC over JDBC).
    J'ai même pas vu qu'il utilisait java 8 .
    @Toogda, pourquoi utiliser Ms Access?

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 105
    Par défaut
    pourquoi utiliser Ms Access?
    j'avoue que j'ai peu de connaissance sur les bases de donné
    Mais pour ma part:
    1- Microsoft Access est bd déjà installé dans la plus part des poste client qui utilise se programme.
    2- pas besoin d'utiliser un serveur ( ou peut être que quelque chose m’échappe ici)
    par exemple, l'utilisation de MySql me nécessite l'installation de wampServer et surtout ce qui me dérange:
    le demande de wamServer a chaque utilisation du logiciel.

    concernant l'utilisation de ucanaccess la connexion est bien établie mais il y'a toujours un problème au niveau de l’exécution de ma requête.
    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
     public void saisie() throws ClassNotFoundException, SQLException
        {
            Scanner sc = new Scanner(System.in);
     
                System.out.println("Saisir Nom___________________________: ");
                String nom1 = sc.nextLine();
                System.out.println("Saisir Prenom________________________: ");
                String prenom1 = sc.nextLine();
                System.out.println("Saisir Age:__________________________: ");
                int age1 = sc.nextInt();
                System.out.println("--------------- Fin Entrée ---------------------");
                setNom(nom1); setPrenom(prenom1); setAge(age1);
     
        Connection con1 = connect();
        String rq = "insert into personne values ('"+this.getNom()+"', '"+this.getPrenom()+"', '"+this.getAge()+"')";
        PreparedStatement pst = con1.prepareStatement(rq);
        int nb = pst.executeUpdate();
        }
        // methode de connextion
        public Connection connect() throws ClassNotFoundException  {
           Connection con = null;
            try {
                Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
                con = DriverManager.getConnection("jdbc:ucanaccess://c:\\Users\\KABRE\\Documents\\TestAccessDB.accdb", "", "");
                System.out.println("Connection Etablie! \n");
            }
            catch (SQLException e) {
                System.out.println("Impossible de se connecter à la base");
            }
            return con;
        }
    voici le message d'erreur.

    Connection Etablie!

    Exception in thread "main" net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.2 row column count mismatch
    at net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:528)
    at testaccess.Personne.saisie(Personne.java:65)
    at testaccess.TestAccess.main(TestAccess.java:14)
    Caused by: java.sql.SQLSyntaxErrorException: row column count mismatch
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
    at net.ucanaccess.jdbc.UcanaccessConnection.prepareStatement(UcanaccessConnection.java:525)
    ... 2 more
    Caused by: org.hsqldb.HsqlException: row column count mismatch
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.ParserDQL.XreadContextuallyTypedTable(Unknown Source)
    at org.hsqldb.ParserDML.compileInsertStatement(Unknown Source)
    at org.hsqldb.ParserCommand.compilePart(Unknown Source)
    at org.hsqldb.ParserCommand.compileStatement(Unknown Source)
    at org.hsqldb.Session.compileStatement(Unknown Source)
    at org.hsqldb.StatementManager.compile(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 5 more
    C:\Users\KABRE\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
    BUILD FAILED (total time: 31 seconds)

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

Discussions similaires

  1. [AC-2010] Choix d'un format d'une base de données avec Access 2010
    Par ACNTOURAINE dans le forum Access
    Réponses: 5
    Dernier message: 03/12/2014, 14h14
  2. securiser une base de donnée sous access 97
    Par mome67 dans le forum Sécurité
    Réponses: 2
    Dernier message: 10/08/2007, 22h38
  3. Réponses: 1
    Dernier message: 17/05/2006, 16h27
  4. Réponses: 5
    Dernier message: 13/12/2005, 17h04
  5. est ce que d'apres une base de données en access,
    Par loveflower dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 26/10/2004, 17h12

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