JAVA SE et Base de donnees Postgre

Fermé
basopro Messages postés 100 Date d'inscription vendredi 11 mars 2011 Statut Membre Dernière intervention 3 juin 2015 - Modifié par BmV le 3/04/2013 à 19:00
basopro Messages postés 100 Date d'inscription vendredi 11 mars 2011 Statut Membre Dernière intervention 3 juin 2015 - 6 avril 2013 à 19:58
Bonjour,

je voudrais conecter une base app codee en Java SE a une base de donnees Postgre sous Eclipse. Laconnexion marche a merveille. le Hic, c'est au nivaut des requete.

La requete suivant ne marche pas:

String Req = "SELECT Cod_Prod, Nom_Prod, produits.Cod_Comd, Cod_Comd,commandes.DateComd FROM commandes ";   
Req +="INNER JOIN produits ON Cod_Comd=produits.Cod_Comd ";   
Req +="ORDER BY commandes.Cod_Comd";



Eclipse me retourne cette erreur:

 Position: 8   
 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157)   
 at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886)   
 at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)   
 at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555)   
 at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:403)   
 at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:283)   
 at Test.ConnectDB.main(ConnectDB.java:40)


et losrque je mets des Cotes et caractere d'echacpement autour de chaque Champ, comme ceci : (\"Colone1\', ) , la requete marche bien.

Voici donc ce que j'ai fais:

String Req = "SELECT Cod_Prod, \"Nom_Prod\", \"produits\".\"Cod_Comd\", \"commandes\".\"Cod_Comd\", \"commandes\".\"DateComd\" FROM commandes ";   
Req +="INNER JOIN \"produits\" ON \"commandes\".\"Cod_Comd\"=\"produits\".\"Cod_Comd\" ";   
Req +="ORDER BY \"commandes\".\"Cod_Comd\"";


Ma question est la suivante: Y a til un moyen pour le faire simple sans des erruer ? Parce que je vois cela tres tres debile de passer son temps a mettre des cotes et echapements autour des chaque champs d'une requete, et si nous avons une requete qui inclu 7 jointures a la fois ? perte de temps !

Cordialement
A voir également:

8 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 3/04/2013 à 18:58
Il me semble (tu testeras) que tu peux remplacer tes échappements par une simple apostrophe.

String Req = "SELECT Cod_Prod, 'Nom_Prod', 'produits'.'Cod_Comd', 'commandes'.'Cod_Comd', 'commandes'.'DateComd' FROM commandes INNER JOIN 'produits' ON 'commandes'.'Cod_Comd'='produits'.'Cod_Comd' ORDER BY 'commandes'.'Cod_Comd'";

Remarque : tes Req+= sont une perte inutile de temps et de mémoire, il est préférable de l'écrire en une seule String, plutôt que de faire deux opérations de concaténation inutiles qui vont au final manipuler 5 String quand 1 seul suffit...La confiance n'exclut pas le contrôle
0
basopro Messages postés 100 Date d'inscription vendredi 11 mars 2011 Statut Membre Dernière intervention 3 juin 2015 1
3 avril 2013 à 19:58
Merci, mais ça ne marche toujours pas, et l'erreur m'apprend que la colonne 'commandes'.'Cod_Comd' est introuvable, parcontre quand j'execute lq solution que tu viens de donner au niveau du SGBDR Postgres, ca marche san bleme, ce qui sous entend que le probleme est au niveau de JAVA;

cordiqlement
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
3 avril 2013 à 20:09
Je n'y connais pour ainsi dire pas grand chose en SQL, et encore moins au Postgre, mais la notation 'produits'.'Cod_Comd' est bizarre syntaxiquement, ne serait-ce pas plutôt 'produits.Cod_Comd' (avec le point dans les guillemets) ?
0
basopro Messages postés 100 Date d'inscription vendredi 11 mars 2011 Statut Membre Dernière intervention 3 juin 2015 1
Modifié par basopro le 3/04/2013 à 20:28
effectivement,
 'produits'
est ler nom de la table et
'Cod_Comd'
est le nom de la colonne, :lq syntaxe standard est la suivante:
produits.Cod_Comd
malgré tout ca, ca ne marche pas; <eclip^se ou nNet>Beans m'insulte en me disant que 'produits'.'Cod_Comd' est introuvable
cordialement
0

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

Posez votre question
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
3 avril 2013 à 20:29
Montre le code Java que tu utilises et le code d'erreur que tu obtiens.
0
basopro Messages postés 100 Date d'inscription vendredi 11 mars 2011 Statut Membre Dernière intervention 3 juin 2015 1
Modifié par basopro le 3/04/2013 à 21:10
voici le code:

il s'agit dan un premier temp 'dafficher le contenu de la table "produit", ensuite je les modifie via la requete (UPDATE .....), en fin je reaffiche le contenu de cette meme table pour voir si les modification on pris effet.



import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSetMetaData; 
import java.sql.ResultSet; 
import java.sql.Statement; 

public class ConnectDB { 

    public static void main(String[] args) { 
        
        // Processus de connexion a une base de donnee Postrgre via Java SE 
        try 
        { 
        Class.forName("org.postgresql.Driver"); 
        System.out.println(" Driver reussi !"); 
        // Variable de connexion 
        String URL="jdbc:postgresql://localhost:5432/Client"; 
        String Login= "****"; 
        String Passs="****"; 

  String  Req = "SELECT \"Cod_Prod\", \"Nom_Prod\", \"produits\".\"Cod_Comd\" FROM produits "; 

Connection Chaine = DriverManager.getConnection(URL, Login, Passs); 
        Chaine.setAutoCommit(false); 
        System.out.println(" Conexion Reussie 1!"); 

        Statement State = Chaine.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
        
         
      PreparedStatement Prepare = Chaine.prepareStatement("UPDATE produits SET 'Nom_Prod'=? WHERE 'Nom_Prod'='SONY VAIO ES45'"); 
        ResultSet Resultat = State.executeQuery(Req); 
         
        ResultSetMetaData Metadata = Resultat.getMetaData(); 
         
        //affichage des donees d'origines 
        System.out.print("Donnees D'ORIGINEs\n"); 
        while(Resultat.next()) 
        { 
         System.out.print("\t\t\t =>" + Resultat.getString("Nom_Prod")+ "\t\n"); 
        } 
         
        //Modification des donnees 
        Prepare.setString(1, "SONY VAIO ES45 Core i7"); 
        //validation de la MAJ 
        Prepare.executeUpdate(); 
         
        Resultat = State.executeQuery(Req); 
        System.out.print("Donnees modifiees\n"); 
        while(Resultat.next()) 
        { 
         System.out.print("\t\t\t =>" + Resultat.getString("Nom_Prod")+ "\t\n"); 
        } 
           
        Resultat.close(); 
        State.close(); 
        } 
        catch(Exception e) 
        { 
                e.printStackTrace(); 
                System.out.println(" Conexion echouee!"); 
        } 
    } 
} 



=======================================
et voici l'erreur :
============================

org.postgresql.util.PSQLException: ERROR: syntax error at or near "'Nom_Prod'"
  Position: 21
 Conexion echouee!
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
	at ConnectDB.main(ConnectDB.java:56)


c'est juste un test que je fesais.

cordialement.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
3 avril 2013 à 22:09
Quelques remarques préliminaires :

1) les noms de variables en Java commencent par convention avec des minuscules afin de distinguer les appels de méthodes sur des objets, les appels de méthodes statiques sur des classes, et les appels de classes internes statiques sur des classes.

2) pas besoin de mettre des \n à la fin de tes print, tu peux utiliser println !

3) décomposes ton code en méthodes quand tu le peux, d'autant qu'ici tu fais deux fois la même séquence (avant et après modification), ça permet de découper les opérations, et de s'y retrouver plus facilement.

4) ferme toujours tout ce que tu ouvres, dans ton code tu fermais par exemple le dernier "Resultat" mais pas le premier, ça peut un jour te poser problème, notamment en terme de mémoire (car celui qui n'est pas fermé empêche un nouveau d'être créé, si tu as des limites sur le nombres de résultats ouverts par la BDD, tu pourrais alors te retrouver coincer)

5) les try/catch doivent être placés judicieusement afin de gérer les exceptions sur les parties de code qu'elles filtrent. Il n'est donc pas normal d'avoir "Conexion echouee!" dans ton exécution alors que l'erreur ne se situe pas à la connexion. Alors, cela demande plus de code, c'est long et fastidieux, mais ça te permet de mieux gérer les erreurs, et donc de déboguer plus facilement.

Remarque : vu que je n'ai pas de base de données, je n'ai pas pu tester le code, mais maintenant que les try/catch sont bien mis, dis moi les erreurs que tu obtiens.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ConnectDB
{
    private static void displaySelect(Connection connection)
    {
        Statement statement = null;
        try 
        {
            statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
        }
        catch (SQLException e)
        {
            System.err.println("Erreur de création du statement");
            e.printStackTrace();
            return;
        }        
        
        ResultSet result = null;
        try
        {
            result = statement.executeQuery("SELECT 'Cod_Prod', 'Nom_Prod', 'produits.Cod_Comd' FROM 'produits'");
        } 
        catch (SQLException e)
        {
            System.err.println("Erreur d'exécution de la requête");
            e.printStackTrace();
            return;
        } 
        
        try
        {
            while(result.next())
                System.out.print("\t\t\t =>" + result.getString("Nom_Prod")+ "\t\n");
        } 
        catch (SQLException e)
        {
            System.err.println("Erreur de lecture du résultat");
            e.printStackTrace();
        }
        
        try 
        {
            result.close();
        } 
        catch (SQLException e)
        {
            System.err.println("Erreur de fermeture du ResultSet");
            e.printStackTrace();
        }
        
        try 
        {
            statement.close();
        }
        catch (SQLException e)
        {
            System.err.println("Erreur de fermeture du Statement");
            e.printStackTrace();
        }        
    }
    
    private static void executeUpdate(Connection connection)
    {
        PreparedStatement statement = null;        
        try 
        {
            statement = connection.prepareStatement("UPDATE produits SET 'Nom_Prod'=? WHERE 'Nom_Prod'='SONY VAIO ES45'");
        } 
        catch (SQLException e)
        {
            System.err.println("Erreur de création du PreparedStatement");
            e.printStackTrace();
            return;
        }
        
        try 
        {
            statement.setString(1, "SONY VAIO ES45 Core i7");
        } 
        catch (SQLException e)
        {
            System.err.println("Erreur de modification du paramètre");
            e.printStackTrace();
        } 
        
        try
        {
            statement.executeUpdate();
        }
        catch (SQLException e)
        {
            System.err.println("Erreur d'exécution de la requête");
            e.printStackTrace();
        }
        
        try
        {
            statement.close();
        }
        catch (SQLException e)
        {
            System.err.println("Erreur de fermeture du PreparedStatement");
            e.printStackTrace();
            return;
        }
    }
    
    public static void main(String[] args) 
    {        
        try
        {
            Class.forName("org.postgresql.Driver");
        }
        catch (ClassNotFoundException e)
        {
            System.err.println("Erreur de chargement du driver");
            e.printStackTrace();
            return;
        }
        
        Connection connection = null;
        try 
        {
            connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/Client", "****", "****");
        }
        catch (SQLException e) 
        {
            System.err.println("Erreur de connexion");
            e.printStackTrace();
            return;
        } 
        
        //======================//
        
        System.out.println("Données d'origines :");
        displaySelect(connection);
        
        executeUpdate(connection);
        
        System.out.println("Données modifiées :");
        displaySelect(connection);
        
        //======================//
        
        try 
        {
            connection.close();
        } 
        catch (SQLException e)
        {
            System.err.println("Erreur de fermeture de la connexion.");
            e.printStackTrace();
            return;
        }
    }
}
0
basopro Messages postés 100 Date d'inscription vendredi 11 mars 2011 Statut Membre Dernière intervention 3 juin 2015 1
3 avril 2013 à 22:42
voici ceque je recois comme erreur:
=========================================

 run:
Données d'origines :
Données modifiées :
Erreur d'exécution de la requête
org.postgresql.util.PSQLException: ERROR: syntax error at or near "'produits'"
  Position: 57
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
	at ConnectDB.displaySelect(ConnectDB.java:27)
	at ConnectDB.main(ConnectDB.java:142)
Erreur d'exécution de la requête
org.postgresql.util.PSQLException: ERROR: syntax error at or near "'Nom_Prod'"
  Position: 21
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
	at ConnectDB.executeUpdate(ConnectDB.java:94)
	at ConnectDB.main(ConnectDB.java:144)
Erreur d'exécution de la requête
org.postgresql.util.PSQLException: ERROR: syntax error at or near "'produits'"
  Position: 57
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
	at ConnectDB.displaySelect(ConnectDB.java:27)
	at ConnectDB.main(ConnectDB.java:147)
BUILD SUCCESSFUL (total time: 0 seconds)



Merci por la restructuration du code, il est encore mieux


Cordialement
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
4 avril 2013 à 05:35
Bon, il y a l'affichage qui ne marche pas terrible, il faut remplacer les System.out par des System.err on y verrai plus clair :

        //======================//
        
        System.err.println("Données d'origines :");
        displaySelect(connection);
        
        executeUpdate(connection);
        
        System.err.println("Données modifiées :");
        displaySelect(connection);
        
        //======================//

Mais clairement, on voit bien que ce sont tes trois requêtes qui plantent (pas une seulement)

ERROR: syntax error at or near " 'produits' "     Position: 57
ERROR: syntax error at or near " 'Nom_Prod' "     Position: 21
ERROR: syntax error at or near " 'produits' "     Position: 57

Essaye sans aucun guillemet pour les noms de champs, parce que du peu de code SQL que j'ai pu croiser, je ne me souviens pas qu'il y ait eu autant de guillemets dans des requêtes...

result = statement.executeQuery("SELECT Cod_Prod, Nom_Prod, produits.Cod_Comd FROM produits");
statement = connection.prepareStatement("UPDATE produits SET Nom_Prod=? WHERE Nom_Prod='SONY VAIO ES45'");
0
basopro Messages postés 100 Date d'inscription vendredi 11 mars 2011 Statut Membre Dernière intervention 3 juin 2015 1
6 avril 2013 à 19:58
Merci pour ton aide KX. meme sans les guillemets, y a toujours erreurs.
0