[Java] Problème avec BDD SQLite

Résolu
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013 - 18 avril 2012 à 15:17
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 - 19 avril 2012 à 12:35
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

cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
18 avril 2012 à 15:33
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() + "');";
3
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
18 avril 2012 à 16:05
non, fais plutot:

public void actionPerformed(ActionEvent pEvent)
{
    try{
        //tout ce que tu dois faire
    } catch (SQLException pExc) {
        // par exemple
        pExc.printStackTrace();
    }
}
3
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
18 avril 2012 à 16:02
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)
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
18 avril 2012 à 16:19
Ç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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
18 avril 2012 à 16:29
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.
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
18 avril 2012 à 17:36
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.
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
19 avril 2012 à 08:08
peux-tu nous donner la requête que tu exécute?

C'est une erreur de compilation ou d'exécution?
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
19 avril 2012 à 08:54
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.
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
19 avril 2012 à 08:59
tu sais donner la valeur de requeteUser avant le executeQuery?
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
19 avril 2012 à 09:08
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()
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
19 avril 2012 à 09:20
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.
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
19 avril 2012 à 09:20
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.
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
19 avril 2012 à 09:56
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.
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
19 avril 2012 à 10:03
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...
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
19 avril 2012 à 10:27
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 ?
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
19 avril 2012 à 10:30
? 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...
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
19 avril 2012 à 10:45
D'accord, je ferai ça.
Merci pour tous tes conseils.
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
19 avril 2012 à 11:03
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 ?
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
19 avril 2012 à 11:12
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"));

    //...
}
0
yannOpenGL Messages postés 141 Date d'inscription samedi 4 février 2012 Statut Membre Dernière intervention 3 avril 2013
19 avril 2012 à 11:28
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);
}
0
Rejoignez-nous