Java / ajout / BDD

Fermé
Emilie - 21 avril 2008 à 19:27
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 25 avril 2008 à 12:56
Bonjour,
Voici mon problème, je souhaite ajouter des données dans ma base de données, mais voilà j'ai un problème au niveau de ma requête d'ajout... En effet j'ai un message d'erreur : "java.sql.SQLException: No ResultSet was produced" et cette erreur me renvoie à ma requête d'ajout.
Si quelqu'un voit mon erreur je lui serait reconnaissante !

Code de la requête d'ajout :


ResultSet result = req.executeQuery("INSERT INTO T_Vs (NoV,LibV, DDebut, Duree, Nb, NoD) VALUES (" + pNoV + ", '" + pLibV + "', '" + pDDebut + "'," + pDuree + "," + pNb + "," + pNoD + ")");

ah oui aussi, quand je remplace le "executeQuery" par "executeUpdate" cela me met une erreur?

Merci d'avance pour votre aide

Emilie
A voir également:

20 réponses

kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
22 avril 2008 à 10:25
Bonjour,

Lorsque tu fais un insert dans une base de donnée, cela ne produit jamais de resultSet en retour.
Donc effectivement, tu as utiliser la méthode executeQuery qui généralement est plutôt réservée pour une requête de sélection et non d'insertion.
Il faut donc que tu utilise executeUpdate sans attendre rien en retour. Un try / catch suffira pour savoir si la requête SQL est correctement effectuée ou non.

Voici le descriptif pour la méthode executeUpdate :
	executeUpdate(String sql)
          Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.


Et voici celle pour executeQuery :
 ResultSet 	executeQuery(String sql)
          Executes the given SQL statement, which returns a single ResultSet object.


Tu comprends donc maintenant pourquoi tu as une erreur de type 'no result...'
2
Salut !! merci d'avoir répondu !!
alors j'ai fais comme tu as dis (enfin je crois !!) bon alors maintenant je n'ai plus d'erreur de type 'no result...' mais le truc maintenant c'est que je ne sais pas comment ajouter les données dans la base de données... La requête à l'air de bien s'exécuter...
merci encore de ton aide

Emilie
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
22 avril 2008 à 15:24
A priori si ta requête SQL est bonne et que tes valeurs sont placées dans tes variables tu devrais avoir tes informations enregistrées dans ta base de donneés, non ?
Si tu n'es pas certaine tu peux toujours aller voir dans la base s'il y a bien un enregistrement de plus suite à l'exécution de ta requête.
0
RE !!
je suis allée voir dans ma base de données pour voir si les informations étaient bien enregistrées dans la table, mais elles ne le sont pas !! sniff !!! ya t-il d'autres instructions à écrire à la suite de la requête d'ajout pour que les données s'enregistrent dans la base? au sinon d'où pourrait provenir le problème?

merci

Emilie
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
22 avril 2008 à 16:58
Ca fait longtemps que j'ai pas fais de JDBC mais il ne me semble pas qu'il y ai autre chose derrière.
Pour avancer dans ton problème il faudrait plutôt que tu test ta requête pour savoir si elle est correcte ou non.
Pour cela, va dans l'interface d'administration de ta base de données tu dois avoir un module pour lancer des requêtes SQL.
Lance la requête que tu essai de faire avec ton code Java (en donnant des valeurs réelles aux propriétés) et regarde si elle s'effectue correctement ou si un message d'erreur apparait.
0
Alors je viens de faire ce que tu m'as dis... et sa s'exécute à la perfection .... donc le problème ne concerne pas ma requête? faut surement que je rajout quelque chose pour que cela s'ajoute dans la base !
merci
Emilie
0
Utilisateur anonyme
22 avril 2008 à 17:25
Petite suggestion : Vérifie que les paramètres que tu passes ne sont pas vides ou ne valent pas null.
0
Non je ne penses pas que mes paramètres soient vides ou null
Je pense que ça serait une bonne idée que je mette ma requête d'ajout !! si ça se trouve c moi qui ait fait une erreur depuis le début... (oups !!) Voici la requête :

String resul = ("INSERT INTO T_Vi (NoVi,LibVi, DVi, DureeVi, NbInscrits, NoDVi) VALUES (" + pNoVi + ", '" + pLibVi + "', '" + pDVi + "'," + pDureeVi + "," + pNbIns + "," + pNoDVi + ")");

Merci de votre aide

Emilie
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857 > Emilie
22 avril 2008 à 17:39
A priori la syntaxe est bonne.
Est ce que tu peux mettre tout le code qui entoure l'exécution de cette requête ?
0
Emilie > kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013
22 avril 2008 à 17:46
Voici la syntaxe qui entourent ma requête :

String url = "jdbc:odbc:Visites.mdb";

try{
con=DriverManager.getConnection(url,"","");

Statement req = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

String resul = ("INSERT INTO T_Vi (NoVi,LibVi, DVi, DureeVi, NbInscrits, NoDVi) VALUES (" + pNoVi + ", '" + pLibVi + "', '" + pDVi + "'," + pDureeVi + "," + pNbIns + "," + pNoDVi + ")");

req.executeUpdate(resul);
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857 > Emilie
22 avril 2008 à 17:49
Ajoute un try {} catch dans ton code, comme ci-dessous et dis nous s'il y a une erreur de marquée :
try{
    int myRes = req.executeUpdate(resul);
    System.out.println("Retour = "+myRes);
}catch (Exception e){
 System.err.println("Error : "+e.getMessage());
}


S'il n'y a pas d'erreur peux-tu nous dire quel est le résultat du retour (l'entier) ? (Normalement le chiffre en retour est le nombre de ligne insérée dans la base de donnée)
0
Emilie > kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013
22 avril 2008 à 17:56
Résultat du retour :

Retour = 1

voilà
Emilie
0

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

Posez votre question
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
22 avril 2008 à 17:30
Comme le suggère Alex, es-tu certaine que tu as bien mis les mêmes valeurs que celles issues de ton programme java, essais de les afficher sur la console avant l'exécution de ta requête via le programme.
0
Blue project
23 avril 2008 à 23:54
Pour preperedStatement essaye comme sa
PreparedStatement st =con.prepareStatement ("insert into T_Vi values(?,?,?,?,?,?)"); 
st.setInt(1, pNoVi); 
st.setString(2, pLibVi); 
st.setString(3, pDVi); 
st.setInt(4, pDureeVi); 
st.setInt(5, pNbIns); 
st.setInt(6, pNoDVI); 
st.executeQuery();


sans plus ni moin de code sa devrai marché. Si tu initialise bien toutes tes variables.
pour vérifier t'a requête, System.out.print(st); ^^
0
salut !! merci de ta réponse

juste une précision : tu entends quoi par : "Si tu initialise bien toutes tes variables." ?

merci de ton aide

Emilie
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
24 avril 2008 à 09:40
st.setInt(1, pNoVi); 


Permet de remplace le premier '?' par la valeur de ta variable nommée 'pNoVi'.
Donc, pas "bien initialiser tes variables", Blue project veut dire qu'il faut que plus haut dans ton code tu as déclaré et renseignée (donnée une valeur) à tes variables pNoVi, pLibVi, pDVi, pDureeVi, pNbIns et pNoDVI.

Ex :
int pNoVi = 2;
String pLibVi = "mon lib";
// --- etc...

0
bonjour !!!

j'ai donné une valeur aux différentes variables de cette façon:

package visite;

public class TestVisite {
public static void main(String[] args) {
AVisite av = new AVisite();
av.nouvelleVisite(20,"Essai","14/12/2008", 25, 3, 4);
}
}

Emilie
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
24 avril 2008 à 16:52
Ok, et ça marche ou pas ?
Si ce n'est pas le cas peux tu mettre le code de ta classe AVisite ?
0
package visite;

import java.util.*;
import java.sql.*;

public class AVisite {
private Vector <Visite> vectVisite;
private Vector <Destination> vectDestination;
// Objet permettant la connexion à la base de données.
Connection con;

public AVisite(){
vectVisite = new Vector <Visite>();
vectDestination = new Vector <Destination>();
String url = "jdbc:odbc:Visites.mdb";
Connection con = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection(url,"","");

Statement requete = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet resultat=requete.executeQuery("Select NoDestination, LibDestination from T_Destinations");
resultat.beforeFirst();
while (resultat.next()){
// Ajout dans le vecteur à partir de la table T_Destinations.
Destination dest = new Destination(resultat.getInt("NoDestination"), resultat.getString("LibDestination"));
vectDestination.add(dest);
};
Statement req = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet result = req.executeQuery("Select NoVi, LibVi, DVi,DureeVi,NbInscrits,NoDVi from T_Vi");
result.beforeFirst();
while (result.next()){

Visite vis = new Visite(result.getInt("NoVi"), result.getString("LibVi"), result.getString("DVi"),result.getInt("DureeVi"), result.getInt("NbInscrits"), result.getInt("NoDVi"));
vectVisite.add(vis);

}
}
catch(Exception e) {System.out.println(e);}
}
public void nouvelleVisite(int pNoVi, String pLibVi, String pDVi, int pDureeVi, int pNbIns, int pNoDVi){

String url = "jdbc:odbc:Visites.mdb";

try{
con=DriverManager.getConnection(url,"","");
PreparedStatement st =con.prepareStatement("INSERT INTO T_Vi (NoVi,LibVi, DVi, DureeVi, NbInscrits, NoDVi) VALUES (" + pNoVi + ", '" + pLibVi + "', '" + pDVi + "'," + pDureeVi + "," + pNbIns + "," + pNoDVi + ")");

st.setInt(1, pNoVi);
st.setString(2, pLibVi);
st.setString(3, pDVi);
st.setInt(4, pDureeVi);
st.setInt(5, pNbIns);
st.setInt(6, pNoDVI);
st.executeUpdate();
con.commit();
st.close();
;
}
catch(SQLException e) {
e.printStackTrace();
}
}
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
24 avril 2008 à 17:16
Pour ta requête il me semble qu'il t'as été dit de remplacer avec des '?' :
Donc ceci :
PreparedStatement st =con.prepareStatement("INSERT INTO T_Vi (NoVi,LibVi, DVi, DureeVi, NbInscrits, NoDVi) VALUES (" + pNoVi + ", '" + pLibVi + "', '" + pDVi + "'," + pDureeVi + "," + pNbIns + "," + pNoDVi + ")");

Devient :
PreparedStatement st =con.prepareStatement("INSERT INTO T_Vi (NoVi,LibVi, DVi, DureeVi, NbInscrits, NoDVi) VALUES (?,?,?,?,?,?)");

0
Pardon, j'avais les 2 requêtes à la suite, et j'ai copié la mauvaise !! pardon, j'utilise bien la requête avec des "?", l'autre je l'ai mise en commentaire !!
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
24 avril 2008 à 17:37
Et que se passe-t-il ? Toujours rien, pas même un petit message d'erreur ?

Ce que tu peux essayer :
remplacer :
SQLException 

par :
Exception 

Pour catcher n'importe quel type d'exception.

Aussi, que se passe-t-il si tu inverse ces deux instructions :
con.commit();
st.close(); 

devient :
st.close(); 
con.commit();

0
Il n'y a aucune erreur qui s'affiche ... même si je change SQLException par Exception ou si j'inverse st.close() et con.commi() .....

Emilie
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
24 avril 2008 à 17:59
Ben écoute, comment dire... je sèche ^^
Je vois que tu ne met aucun user / mot de passe pour créer la connexion à ta base de données, je ne pense pas que ce soit normal, si ?
con=DriverManager.getConnection(url,"",""); 

Pas de mot de passe je veux bien, mais pas de user Oo
0
Mais pour mes fonctions pour afficher tout marche bien, et je n'est pas mis de nom d'utilisateur .....
0
Bon alors il y un progres... mais ce n'est pas encore ça !! mdr
Je peux ajouter les données si à la suite de ma fonction d'ajout de nouvelle visite, j'ai une autre fontion...
exemple :

av.nouvelleVisite(27, "Test", "15/10/2008", 7, 20, 4);
av.afficheVisite();

une fois que j'ai fais fais ça, les données s'ajoutent bien, et elle s'affichent bien, mais je ne peux pas utiliser la fonction toute seule ... il est où le problème... je pensait qu'on pouvait utiliser les fonctions séparément?!!

Emilie
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2008 à 10:36
J'ai remarqué aussi une chose très importante : dans ton programme tu ouvre à chaque fois une nouvelle connexion dès que tu veux faire quelque chose sur ta base de données : il ne faut pas oublié de fermer cette connexion après utilisation sinon tu vas te retrouver avec plein de connexion ouverte sur ta base de données qui ne servent à rien.

Ca peut éventuellement être la source de ton problème : le fait que les multiples connexion bloquent les mises à jour, et que ces dernières ne se font uniquement lorsque tu fais une autre requête sur ta base.

Sinon, est ce que tu peux mettre ton code, là où tu fais appel à tes différentes fonctions (après initialisation de ton objet av.
0
Bonjour !!!

voici le code où j'appelle les différentes fonctions :

package visite;

public class TestVisite {
public static void main(String[] args) {
AVisite av = new AVisite();
av.nouvelleDestination(20, "Essai");
av.nouvelleVisite(24,"Test","01/05/2008", 11, 21, 1);
av.afficheVisite();
av.afficheDestination();
av.fermerAgence();
}
}

Merci
émilie
0
Blue project
25 avril 2008 à 12:54
oui donc en regardant en bref le code donc voila quelques erreurs.
<code>
package visite;

import java.util.*;
import java.sql.*;

public class AVisite {
private Vector <Visite> vectVisite;
private Vector <Destination> vectDestination;
Connection con;

public AVisite(){
vectVisite = new Vector <Visite>();
vectDestination = new Vector <Destination>();
String url = "jdbc:odbc:Visites.mdb";
Connection con = null;

try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection(url,"","");

// prefere utiliser PreparedStatement ^^
PreparedStatement result= con.prepareStatement("Select * from T_Destinations");
ResultSet rs = ps.executeQuery();
while (rs.next ()){
Destination dest = new Destination(result.getInt("NoDestination"), result.getString("LibDestination"));
vectDestination.add(dest);
}
result=con.prepareStatement("Select * from T_Vi");
rs = ps.executeQuery();
while (rs.next()){
Visite vis = new Visite(result.getInt("NoVi"), result.getString("LibVi"),
result.getString("DVi"),result.getInt("DureeVi"),
result.getInt("NbInscrits"), result.getInt("NoDVi"));
vectVisite.add(vis);
}
}
catch(Exception e) {System.out.println(e);}
}
public void nouvelleVisite(int pNoVi, String pLibVi, String pDVi, int pDureeVi, int pNbIns, int pNoDVi){

String url = "jdbc:odbc:Visites.mdb";

try{
con=DriverManager.getConnection(url,"","");

PreparedStatement st =con.prepareStatement("INSERT INTO T_Vi values(?,?,?,?,?,?)");

st.setInt(1, pNoVi);
st.setString(2, pLibVi);
st.setString(3, pDVi);
st.setInt(4, pDureeVi);
st.setInt(5, pNbIns);
st.setInt(6, pNoDVI);

System.out.println(st);
//Regarde si c'est bien le résultat souhaité
st.executeQuery();
}
catch(SQLException e) {
e.printStackTrace();
}
}
}
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
25 avril 2008 à 12:56
Et as tu corrigé ton code pour fermer tes connexions à la base de données, puis ré-essayer de n'utiliser que la fonction d'ajout pour voir si ça changeait quelque chose ?
0