[Java] Problème avec BDD SQLite [Résolu]

Signaler
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013
-
cormandyr
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
-
Bonjour,

Je suis actuellement en stage. Je dois développer un logiciel en Java qui communique avec une base de données. La base de données utilisée est SQLite.

J'ai commencer à réaliser l'interface graphique avec Eclipse.

J'ai pu créer ma base de donnée avec l'invite de commande.

J'arrive donc à me connecter à la base de données et lire le fichier de données déjà créé en envoyant la requête SELECT * FROM maTable.

Mais ce que je voudrais, c'est pouvoir remplir les tables avec les données entrées sur l'interface graphique lorsque j'appuie sur un JButton.

J'ai essayé avec executeQuery mais pour que ça marche il faudrait utiliser "throws SQLException". Or sur un JButton, on ne peux pas.

Code que j'utilise pour récupérer les données entrées par l'utilisateur :
String requeteUser = "INSERT INTO maTable(nom,ville) VALUES(JTextField1.getText(), JTextField2.getText())";
ConnectionBDD connection = new ConnectionBDD("../testBDD.db",requeteUser );



Merci pour vos réponses.
Bonne journée.

30 réponses

Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
8
Salut

J'ai essayé avec executeQuery mais pour que ça marche il faudrait utiliser "throws SQLException". Or sur un JButton, on ne peux pas.

?

si tu peux...
sur ton boutton en tant que tel non, c'est vrai...
mais le code qui fait l'insertion DB (dans ce cas-ci) est dans le ActionListener (ou la méthode actionPerformed(...)). C'est la que tu dois gérer ton exception...

Autre chose, pour ta requete, fais plutot:
String requeteUser = "INSERT INTO maTable(nom,ville) VALUES('" + JTextField1.getText() + "', '"+ JTextField2.getText() + "');";
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
8
non, fais plutot:

public void actionPerformed(ActionEvent pEvent)
{
    try{
        //tout ce que tu dois faire
    } catch (SQLException pExc) {
        // par exemple
        pExc.printStackTrace();
    }
}
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Salut,

merci pour ta réponse.

Le problème si je mets
public void actionPerformed(ActionEvent arg0)throws SQLException{...


j'ai l'erreur : Exception SQLException is not compatible with throws clause in ActionListener.actionPerformed(ActionEvent)
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Ça ne résout pas les problème du SQLException.
Ça me marque :
Unreachable catch block for SQLException. This exception is never thrown from the try statement body
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Non, c'est bon je n'ai plus cette erreur que j'avais.
Mais j'en ai d'autre après compilation que je comprend pas encore.
Je vais essayer de voir.
Merci.
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Je les ai presque toutes résolues sauf une qui persiste.

Code qui permet d'executer les requêtes :
public ResultSet executerRequete(String requete) throws SQLException {
Statement statement;
statement = con.createStatement();
ResultSet resultat = statement.executeQuery(requete);	
return resultat;
}


L'erreur est : query does not return ResultSet

Le programme plante après la ligne avec executeQuery.
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
8
peux-tu nous donner la requête que tu exécute?

C'est une erreur de compilation ou d'exécution?
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

J'utilise cette requête :
String requeteUser = "INSERT INTO maTable(nom,ville) VALUES('" + JTextField1.getText() + "', '"+ JTextField2.getText() + "');";


Avec les modifications que tu m'as dis.

Le programme compile mais lorsque j'appuie sur mon bouton pour insérer les données dans la base de données ça plante en marquant query does not return ResultSet .

J'ai fait des System.out.println pour vérifier et c'est bien à la ligne avec executeQuery que le programme plante.
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
8
tu sais donner la valeur de requeteUser avant le executeQuery?
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Oui, avec un System.out.println je peux afficher la requête et le résultat donne :
requete : INSERT INTO maTable(nom,ville,code_postale,type) VALUES('a', 'a','4','a');

Je viens de modifier ma requête en mettant Integer.parseInt(JTextField3.getText()) à la place de JTextField3.getText()
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

J'ai aussi essayé d'enlever les guillemet autour du int.

Du coup avant le executeQuery ma requête donne :
requete : INSERT INTO exploitation(nom,ville,code_postale,type_exploitation) VALUES('a', 'a',4,'a');

Mais ça ne change rien au problème.
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
8
tu n'es pas obligé de faire le parse.
Comme tu envoie une String, ta variable int sera automatiquement transformée en texte...
En SQL, pour les valeurs numérique, tu ne les "entoures" pas de ' donc tu aurais comme requête:
INSERT INTO maTable(nom,ville,code_postale,type) VALUES('a', 'a', 4, 'a');

et je sais d'où viens l'erreur ^^

lorsque tu fais une requête de type SELECT, tu appelles la méthode executeQuery et tu récupères le résultat de ta requête via un ResultSet.
Lorsque tu fais une requête qui modifie ta DB (INSERT, DELETE, UPDATE, ...), tu appelles la méthode executeUpdate et tu récupères le nombre de tuple (d'enregistrement) directement impacté par ta requête.
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Ok, je ne savais pas. Merci pour l'explication.

Par contre avec executeUpdate ça me retourne database is locked quand j'appuie sur le bouton.

Code de la fonction executerUpdate :
public void executerUpdate(String requete) throws SQLException {
Statement statement;
statement = con.createStatement();
statement.executeUpdate(requete);
}


Et j'ai bien ma requête :
requete : INSERT INTO exploitation(nom,ville,code_postale,type_exploitation) VALUES('a','a',4,'a');
avant la ligne avec executeUpdate.
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
8
Ta base de données est peut-être utilisée par un autre logiciel qui la bloque...
un peu comme quand tu veux supprimer un fichier qui est en cours d'utilisation...
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

En fait je ne fermais pas la connexion à ma base de données correctement.

Ça à l'air de marcher maintenant. Y a-t-il autre chose que con.close() à utiliser pour fermer la base ou est-ce suffisant ?
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
8
? tu recrées à chaque fois une connexion? si oui, la tu peux améliorer ^^

si tu veux, tu peux (en théorie tu devrais...) fermer aussi ton resultset...

Personnellement, je te conseille d'ouvrir une seule connexion et de la fermée quand tu quittes l'application...
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

D'accord, je ferai ça.
Merci pour tous tes conseils.
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Dernière petite question.
Quand je fais la requête SELECT * FROM exploitation
je n'arrive pas à afficher le résultat.
Je vois juste org.sqlite.RS@486cdd

As tu une idée de pourquoi ?
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
8
tu fais un toString du resultSet, normal que tu ne sache pas voir le resultat correct ^^

fais (de tete):
while ( rs.next() )
{
    //pour une valeur en varchar
    System.out.println("valeur de la première colonne : " + rs.getString(1));

    //pour une valeur en int
    System.out.println("valeur de la deuxième colonne : " + rs.getInt(2));

    //autre moyen d'acces à une donnée du rs
    System.out.println("valeur de la colonne "ville" : " + rs.getString("ville"));

    //...
}
Messages postés
141
Date d'inscription
samedi 4 février 2012
Statut
Membre
Dernière intervention
3 avril 2013

Non, je fais bien des getString :

while(rs.next()){
System.out.println("show_result...");
String nom = rs.getString("nom");
String ville = rs.getString("ville");
int code_postale = rs.getInt("code_postale");
String type_exploitation = rs.getString("type_exploitation");
System.out.println("type_exploitation");

System.out.println("Nom des exploitations : " + nom + "\nVille :" + ville + "\nCode postale : " + code_postale + "\nType d'exploitation : " + type_exploitation);
}
1 2