Java / ajout / BDD
Emilie
-
kij_82 Messages postés 4260 Statut Contributeur -
kij_82 Messages postés 4260 Statut Contributeur -
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
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:
- Java / ajout / BDD
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Waptrick java voiture - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
20 réponses
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 :
Et voici celle pour executeQuery :
Tu comprends donc maintenant pourquoi tu as une erreur de type 'no result...'
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...'
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.
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.
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
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
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.
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.
Petite suggestion : Vérifie que les paramètres que tu passes ne sont pas vides ou ne valent pas null.
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
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
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);
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);
Ajoute un try {} catch dans ton code, comme ci-dessous et dis nous s'il y a une erreur de marquée :
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)
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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
Pour preperedStatement essaye comme sa
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); ^^
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); ^^
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...
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();
}
}
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();
}
}
Pour ta requête il me semble qu'il t'as été dit de remplacer avec des '?' :
Donc ceci :
Devient :
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 (?,?,?,?,?,?)");
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 !!
Et que se passe-t-il ? Toujours rien, pas même un petit message d'erreur ?
Ce que tu peux essayer :
remplacer :
par :
Pour catcher n'importe quel type d'exception.
Aussi, que se passe-t-il si tu inverse ces deux instructions :
devient :
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();
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
Emilie
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 ?
Pas de mot de passe je veux bien, mais pas de user Oo
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
Mais pour mes fonctions pour afficher tout marche bien, et je n'est pas mis de nom d'utilisateur .....
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
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
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.
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.
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
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
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();
}
}
}
<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();
}
}
}
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