IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Problème accès base de données Access


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut Problème accès base de données Access
    Bonjour,

    Comme l'indique mon titre j'ai quelques problèmes lorsque j'attaque ma base de données sous Access 2010 :

    -Lorsque je tente d'insérer plusieurs enregistrements dans ma base, seul le premier s'ajoute à celle-ci.

    -Je ne peux supprimer ou modifier les informations de ma base (sauf en passant directement par access bien sûr) même si mes requêtes sont correctes

    (Vérifiées par copier/coller sous access après un System.out.println()).


    Precision importante !
    Un second projet, qui fonctionnait auparavant (sur une autre machine) me fait les mêmes problèmes, cela pourrait-il venir de ma configuration d'eclipse, access ou de ma DSN ?


    La methode de ma DAO Client servant à ajouter un client à la BDD :

    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
    	@Override
    	public boolean create(Client c) {
    		boolean ok = false;
    		String sqlAjout = "INSERT INTO Client (Nom_Cli ,Prenom_Cli ,Tel_Cli) VALUES ('"+ c.getNom() + "','" + c.getPrenom() + "','" + c.getTel() + "');";
    		try
    		{
    			this.connect.createStatement().executeUpdate(sqlAjout);
    			ok = true;
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
    		return ok;
    	}
    Exécution de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public static void main(String[] args)
    	{
    		ClientDAO cDAO = new ClientDAO();
     
    		Client c1 = new Client(1,"Nom1", "Prenom1", "0123456789");
    		Client c2 = new Client(2,"Nom2", "Prenom2", "9876543210");
     
    		cDAO.create(c1);
    		cDAO.create(c2);
    	}
    }
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO Client (Nom_Cli ,Prenom_Cli ,Tel_Cli) VALUES ('Nom1','Prenom1','0123456789');
    INSERT INTO Client (Nom_Cli ,Prenom_Cli ,Tel_Cli) VALUES ('Nom2','Prenom2','9876543210');
    J'ai testé ma connexion à la BDD et elle semble correcte.

    Pourriez-vous m'aider s'il vous plaît ? Cela fait quelques jours que je bloque dessus je commence à désespérer...

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je suppose que ça retourne true et que tu n'a pas d'exception? La première chose que je remarque, c'est que tu ne fais pas de commit. Ce serait bien de commencer par faire un commit de ta transaction quand tu as fini. Je parie que tu t'es mis en autocommit et, comme tu quitte ton application sans même faire un close de la connection, aucune chance que les dernières instructions soient commit.


    Ton schéma d'attaque d'une base de donnée dois toujours suivre cet ordre, au minimum:


    • ouverture de connexion
    • début de la transaction
    • instructions sql
    • commit de la transaction (ou rollback)
    • fermeture de la connexion


    Il te manque au moins les deux dernier points, et je soupçonne qu'il te manque aussi le point numéro 2.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Merci pour ta réponse, je débute en prog et j'aimerais savoir du coup en quoi consiste le début de la transaction et le commit s'il te plaît.
    Ensuite, pourquoi le fait de ne pas fermer la connexion empêcherait mes requêtes de s’exécuter correctement ?
    J'ai déjà mis les "commit" car on m'avait dit de le faire, ça n'a rien changé.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Un transaction, dans une base de données, c'est un ensemble d'opérations formant un tout. Tout passe ou rien ne passe. Le commit sert à valider la transaction. On informe le SGBD que le tout est terminé et qu'il peux définitivement stocker les changement. Le begin, de son coté, marque le début de la transaction. En jdbc, le begin est implicite (si je ne dit pas de bétise).

    Quand on ne précise rien, parfois, le sgbd considère que lors du close, on commit implicitement. Parfosi, au contraire, il considère que c'est un rollback implicite.

    Dans tous les cas, il n'y a rien de tout ça dans le code présenté.


    Dans ton cas:

    commencer par créer la connection
    appeler éventuellement connection.setAutoCommit(false);
    faire tes insert
    appeler connection.commit();
    appeler connection.close() pour bien libérer les ressources au niveau du sgbd.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Merci pour ta réponse (et désolé pour le retard, les fêtes).

    Du coup problème toujours pas résolu.

    Pour suivre le bon schéma, mon code doit-il ressembler à ç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
    	@Override
    	public boolean create(Client c) {
    		boolean ok = false;
    		String sqlAjout = "INSERT INTO Client (Nom_Cli ,Prenom_Cli ,Tel_Cli) VALUES ('"+ c.getNom() + "','" + c.getPrenom() + "','" + c.getTel() + "');";
    		try
    		{
    			this.connect.setAutoCommit(false);
    			this.connect.createStatement().executeUpdate(sqlAjout);
    			this.connect.commit();
    			this.connect.close();
    			System.out.println(sqlAjout);
    			ok = true;
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
    		return ok;
    	}
    Auquel cas voilà ce que ça me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO Client (Nom_Cli ,Prenom_Cli ,Tel_Cli) VALUES ('Nom1','Prenom1','0123456789');
    java.sql.SQLException: Connection is closed
    	at sun.jdbc.odbc.JdbcOdbcConnection.validateConnection(Unknown Source)
    	at sun.jdbc.odbc.JdbcOdbcConnection.setAutoCommit(Unknown Source)
    	at com.persistance.ClientDAO.create(ClientDAO.java:19)
    	at com.vue.ProgPrin.main(ProgPrin.java:20)

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Plutot à ç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
    @Override
    	public boolean create(Client c) {
    		boolean ok = false;
    		String sqlAjout = "INSERT INTO Client (Nom_Cli ,Prenom_Cli ,Tel_Cli) VALUES ('"+ c.getNom() + "','" + c.getPrenom() + "','" + c.getTel() + "');";
    		try
    		{
                            Connection connection = creerConnection();
    			connection.setAutoCommit(false);
    			connection.createStatement().executeUpdate(sqlAjout);
    			connection.commit();
    			connection.close();
    			System.out.println(sqlAjout);
    			ok = true;
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
    		return ok;
    	}

    Tant qu'on y est, je te conseille aussi d'utiliser des preparedStatement (voir la FAQ) plutot que concaténer comme ça des paramètres dans la requete.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Tout d'abord, voici la classe qui me sert de connection à la BDD :

    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
    package com.persistance;
    import java.sql.Connection;
    import java.sql.DriverManager;
     
    public class ConnectionBD {
     
    		/**
                     * URL de connection
                     */
    		private static String url = "jdbc:odbc:dsnAlexis";
     
    		/**
                     * Nom du user
                     */
    		private static String user = "";
     
    		/**
                     * Mot de passe du user
                     */
    		private static String passwd = "";
     
    		/**
                     * Objet Connection
                     */
    		private static Connection connect;
     
    		/**
                     * Méthode qui va nous retourner notre instance
                     * et la créer si elle n'existe pas...
                     * @return
                     */
    		public static Connection getInstance(){
    			if(connect == null)
    			{
    				try 
    				{
    					String pilote = "sun.jdbc.odbc.JdbcOdbcDriver"; 
    					Class.forName(pilote).newInstance(); 
    					connect = DriverManager.getConnection(url, user, passwd);
    				} 
    				catch (Exception e) 
    				{
    					e.printStackTrace();
    				}
    			}		
    			return connect;
     
     
     
    		}	
    	}
    Ensuite, j'ai modifié le code de ClientDAO de manière à ce qu'il soit correct (normalement !) :

    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
    @Override
    	public boolean create(Client c) {
    		boolean ok = false;
    		String sqlAjout = "INSERT INTO Client (Nom_Cli ,Prenom_Cli ,Tel_Cli) VALUES ('"+ c.getNom() + "','" + c.getPrenom() + "','" + c.getTel() + "');";
    		try
    		{
    			connect.setAutoCommit(false);
    			connect.createStatement().executeUpdate(sqlAjout);
    			connect.commit();
    			connect.close();
    			System.out.println(sqlAjout);
    			ok = true;
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		}
    		return ok;
    	}
    Au passage, ma classe ClientDAO herite de ma classe abstraite DAO qui contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	   public DAO(){
    	      this.connect = ConnectionBD.getInstance();
    	   }
    Cela est-il correct ? J'obtiens la même erreur qu'indiquée au dessus.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Non ce n'est pas correct. Tu notera que la différence entre ton code et le mien, c'est que je crée un connexion à chaque fois, que je ferme à la fin, alors que toi tu a une seule et unique connexion, gérée par une méthode statique, qui forcément ne sera plus valide après le premier appel à close.


    Ton code peut être corrigé comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package com.persistance;
    import java.sql.Connection;
    import java.sql.DriverManager;
     
    public class ConnectionBD {
     
    		/**
                     * URL de connection
                     */
    		private static String url = "jdbc:odbc:dsnAlexis";
     
    		/**
                     * Nom du user
                     */
    		private static String user = "";
     
    		/**
                     * Mot de passe du user
                     */
    		private static String passwd = "";
     
     
    		/**
                     * Méthode qui va nous retourner notre instance
                     * et la créer si elle n'existe pas...
                     * @return
                     */
    		public static Connection getConnection(){
     
    				try 
    				{
    					String pilote = "sun.jdbc.odbc.JdbcOdbcDriver"; 
    					Class.forName(pilote).newInstance(); 
    					return DriverManager.getConnection(url, user, passwd);
    				} 
    				catch (Exception e) 
    				{
    					e.printStackTrace();
    				}
    			return null;
     
    		}	
    	}

    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 boolean create(Client c) {
    		boolean ok = false;
    		String sqlAjout = "INSERT INTO Client (Nom_Cli ,Prenom_Cli ,Tel_Cli) VALUES ('"+ c.getNom() + "','" + c.getPrenom() + "','" + c.getTel() + "');";
    		Connection connect = ConnectionBD.getConnection();
    		try
    		{
                            connect.setAutoCommit(false);
    			connect.createStatement().executeUpdate(sqlAjout);
    			connect.commit();
    			System.out.println(sqlAjout);
    			ok = true;
    		}
    		catch (Exception e)
    		{
    			e.printStackTrace();
    		} finally {
    			connect.close();
                    }
    		return ok;
    	}

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    C'est bon, j'ai corrigé et ça fonctionne !
    Merci beaucoup pour ton aide !
    J'irai voir les requêtes préparées dans la FAQ dès que possible si ça peut m'éviter des erreurs du même genre.

    Petite question, dans un try/catch comme celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    				try 
    				{
    					String pilote = "sun.jdbc.odbc.JdbcOdbcDriver"; 
    					Class.forName(pilote).newInstance(); 
    					return DriverManager.getConnection(url, user, passwd);
    				} 
    				catch (Exception e) 
    				{
    					e.printStackTrace();
    				}
    return null;
    Il y a deux return, à partir du moment où on arrive au premier return, le second n'est pas executé ? Du coup null ne sera retourné que dans le cas ou on passe dans le catch ?

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui. Bon on aurait pu faire plus propre en mettant le return null dans le catch

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Oui d'ailleurs c'est fait ! :p

    Si tu vois quelques petites choses qui peuvent être améliorées je suis preneur !

    Merci encore pour ton aide.

    Ne lockez pas de suite s'il vous plaît je vais d'abord tester les update et delete.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Eh bien voilà, tout fonctionne parfaitement.

    Le sujet peut être lock.

    Au vu de la rapidité et de l'efficacité des réponses je pense qu'en cas de problème je reviendrai ici !

    A une prochaine

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    n'oublie pas de cliquer sur le bouton alors

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

Discussions similaires

  1. Probléme accés base de données internes Pocket
    Par hugobosscool26 dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 28/03/2008, 09h41
  2. Acces Base de donnée Access dans un combobox
    Par freko dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/10/2007, 12h10
  3. [MySQL] Problème accès base de données
    Par jokenjo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 19/12/2006, 09h33
  4. Accès Base de données Access
    Par vincent magnin dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 28/06/2006, 12h09
  5. Problème accès base de données
    Par alainconnu dans le forum Outils
    Réponses: 3
    Dernier message: 27/04/2006, 09h31

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