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

yannOpenGL 141 Messages postés samedi 4 février 2012Date d'inscription 3 avril 2013 Dernière intervention - 18 avril 2012 à 15:17 - Dernière réponse : cormandyr 600 Messages postés samedi 20 mai 2006Date d'inscription 8 juillet 2016 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

30 réponses

Meilleure réponse
cormandyr 600 Messages postés samedi 20 mai 2006Date d'inscription 8 juillet 2016 Dernière intervention - 18 avril 2012 à 15:33
3
Merci
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() + "');";

Merci cormandyr 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

Commenter la réponse de cormandyr
Meilleure réponse
cormandyr 600 Messages postés samedi 20 mai 2006Date d'inscription 8 juillet 2016 Dernière intervention - 18 avril 2012 à 16:05
3
Merci
non, fais plutot:

public void actionPerformed(ActionEvent pEvent)
{
    try{
        //tout ce que tu dois faire
    } catch (SQLException pExc) {
        // par exemple
        pExc.printStackTrace();
    }
}

Merci cormandyr 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 76 internautes ce mois-ci

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

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

    //...
}
Commenter la réponse de cormandyr
yannOpenGL 141 Messages postés samedi 4 février 2012Date d'inscription 3 avril 2013 Dernière intervention - 19 avril 2012 à 11:28
0
Merci
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);
}
Commenter la réponse de yannOpenGL

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.