IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Problème avec prepareStatement


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut Problème avec prepareStatement
    Bonjour bonjour, j'avais fais mes requetes avec de simple createStatement, puis après renseignement, j'ai réaliser qu'utiliser des prepareStaement était grave conseiller dans mon cas.
    Problème, bah ca marche pas.

    J'ai ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    PreparedStatement prepCreatQimp = connexion.prepareStatement("CREATE VIEW QIMP AS (SELECT T_QUESTION_ID, CODEQUESTION FROM QUESTION WHERE T_QUESTIONNAIRE_ID=?)");
    PreparedStatement prepCreatQexp = connexion.prepareStatement("CREATE VIEW QEXP AS (SELECT T_QUESTION_ID, CODEQUESTION FROM QUESTION WHERE T_QUESTIONNAIRE_ID=?)");
    PreparedStatement prepCreatQjointure = connexion.prepareStatement("CREATE VIEW QJOINTURE AS (SELECT QIMP.T_QUESTION_ID AS QIMPID, QEXP.T_QUESTION_ID AS QEXPID FROM QEXP, QIMP WHERE ( QEXP.CODEQUESTION=QIMP.CODEQUESTION) )");
     
    PreparedStatement prepInsertRep = connexion.prepareStatement("INSERT INTO REPONSE_TEMP (T_QUESTION_ID, T_INDIVIDUSTEMP_ID, VALEUR, REPONSE) " +
    					"SELECT T_QUESTION_ID, T_INDIVIDUSTEMP_ID, VALEUR, REPONSE FROM IND_TEMP_QUESTION WHERE (T_INDIVIDUSTEMP_ID =?)");
     
    PreparedStatement prepChangeIndRep = connexion.prepareStatement("UPDATE REPONSE_TEMP SET T_INDIVIDUSTEMP_ID=?");
     
    PreparedStatement prepQRep = connexion.prepareStatement("UPDATE REPONSE_TEMP SET T_Question_ID = ( SELECT QIMPID FROM QJOINTURE WHERE QJOINTURE.QEXPID=REPONSE_TEMP.T_Question_ID ) WHERE T_Question_ID IN ( SELECT QEXPID FROM QJOINTURE ) ");
     
    PreparedStatement prepInsertIndQ = connexion.prepareStatement("INSERT INTO IND_TEMP_QUESTION (T_QUESTION_ID, T_INDIVIDUSTEMP_ID, VALEUR, REPONSE) " +
    					"SELECT T_QUESTION_ID, T_INDIVIDUSTEMP_ID, VALEUR, REPONSE FROM REPONSE_TEMP");



    L'erreur "Table not found in statement" est levé ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE REPONSE_TEMP SET T_Question_ID = ( SELECT QIMPID FROM QJOINTURE WHERE QJOINTURE.QEXPID=REPONSE_TEMP.T_Question_ID ) WHERE T_Question_ID IN ( SELECT QEXPID FROM QJOINTURE )
    Et là bah je comprend pas, vu que j'utilise la table et les deux vu dans les deux requertes juste avant ...
    Donc voila, si vous voyez ce qui cloche :/

  2. #2
    Membre Expert Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Par défaut
    Et si tu executes cette requete dans ton editeur sql, elle fonctionne ou pas ?

  3. #3
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,

    En général, on fait des PreparedStatement quand on utilise une requête plusieurs fois(Lit le paragraphe 8.1 de ce lien http://jguillard.developpez.com/JDBC/8.html), donc faire la création de vue par PreparedStatement je ne vois pas trop l'utilitée à moins que tu crèes souvent ces vues. Bref, en ce qui concerne ton problème si tu n'exécutes pas tes requêtes de création de vue avant l'utilisation de ces dernières, ça ne peut pas marcher(Je me base que sur le code que tu nous as fournie, si tu le fais montre nous plus de code ).

    A+
    Hydraland

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    J'ai après une boucle qui peut effectuer plusieurs disaines de milliers de fois cette requete, mais vu que ca plante avant, bah je ne m'en suis pas encore préoccuper.

    Je met le code des deux fonctions pour montrer au cas ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
     
    public void importIndividus(GroupeIndividu gImport, GroupeIndividu gExport, Questionnaire qExp, java.sql.PreparedStatement prep)
    	{
    		try
    		{
     
    			System.out.println("Mowah import individus");
    			int id =gExport.getId();
    			Statement statement= connexion.createStatement();
     
     
    			prep.setInt(1,id);
    			prep.setInt(2,gExport.getQuestionnaire().getIdQuestionnaire());
    			ResultSet resultat=prep.executeQuery();
     
    			//On prepare toute une liste de requete à executer de nombreuse fois
    			PreparedStatement prep2 = connexion.prepareStatement("SELECT * FROM INDIVIDUS WHERE T_INDIVIDUS_ID=?");
     
    			PreparedStatement prepCreatQimp = connexion.prepareStatement("CREATE VIEW QIMP AS (SELECT T_QUESTION_ID, CODEQUESTION FROM QUESTION WHERE T_QUESTIONNAIRE_ID=?)");
    			PreparedStatement prepCreatQexp = connexion.prepareStatement("CREATE VIEW QEXP AS (SELECT T_QUESTION_ID, CODEQUESTION FROM QUESTION WHERE T_QUESTIONNAIRE_ID=?)");
    			PreparedStatement prepCreatQjointure = connexion.prepareStatement("CREATE VIEW QJOINTURE AS (SELECT QIMP.T_QUESTION_ID AS QIMPID, QEXP.T_QUESTION_ID AS QEXPID FROM QEXP, QIMP WHERE ( QEXP.CODEQUESTION=QIMP.CODEQUESTION) )");
     
    			PreparedStatement prepInsertRep = connexion.prepareStatement("INSERT INTO REPONSE_TEMP (T_QUESTION_ID, T_INDIVIDUSTEMP_ID, VALEUR, REPONSE) " +
    					"SELECT T_QUESTION_ID, T_INDIVIDUSTEMP_ID, VALEUR, REPONSE FROM IND_TEMP_QUESTION WHERE (T_INDIVIDUSTEMP_ID =?)");
     
    			PreparedStatement prepChangeIndRep = connexion.prepareStatement("UPDATE REPONSE_TEMP SET T_INDIVIDUSTEMP_ID=?");
     
     
     
    			PreparedStatement prepQRep = connexion.prepareStatement("UPDATE REPONSE_TEMP SET T_Question_ID = ( SELECT QIMPID FROM QJOINTURE WHERE QJOINTURE.QEXPID=REPONSE_TEMP.T_Question_ID ) WHERE T_Question_ID IN ( SELECT QEXPID FROM QJOINTURE ) ");
    			PreparedStatement prepInsertIndQ = connexion.prepareStatement("INSERT INTO IND_TEMP_QUESTION (T_QUESTION_ID, T_INDIVIDUSTEMP_ID, VALEUR, REPONSE) " +
    					"SELECT T_QUESTION_ID, T_INDIVIDUSTEMP_ID, VALEUR, REPONSE FROM REPONSE_TEMP");
     
    			while(resultat.next())
    			{
    				int id_Mere=resultat.getInt("T_INDIVIDUS_ID");
    				prep2.setInt(1, id_Mere);
    				ResultSet resultat2=prep2.executeQuery();
    				String code=null;
    				if(resultat2.next())
    					code = resultat2.getString("CODEINDIVIDU");
     
     
    				int id_ind= resultat.getInt("T_INDIVIDUSTEMP_ID");
    				boolean active=resultat.getBoolean("ACTIVE");
    				Date date = resultat.getDate("DATECREATION");
    				Individus indImp= new Individus(gImport,code, active, date, id_ind );
    				Individus indExp= new Individus(gImport,code, active, date, id_ind );
    				//System.out.println("Je charge ce glandu d'ind : " +indImp.getCode());
    				ajoutInd(indImp, gImport);
     
     
     
     
    				importReponse(indImp, indExp, qExp,prepCreatQimp, prepCreatQexp,prepCreatQjointure, prepInsertRep, prepChangeIndRep, prepQRep, prepInsertIndQ  );
    				//Une fois qu'on a importer la liste dans la base, on supprime la liste de réponse de la mémoire vive.
    				indExp.getListeReponse().clear();
     
    			}
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
    	}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public void importReponse(Individus indImp, Individus indExp, Questionnaire qExp,PreparedStatement prepCreatQimp, PreparedStatement prepCreatQexp, PreparedStatement prepCreatQjointure, PreparedStatement prepInsertRep, PreparedStatement prepChangeIndRep, PreparedStatement prepQRep, PreparedStatement prepInsertIndQ)
    	{
    		try
    		{
     
     
    			//Creation d'une vue ayant toute les questions du questio d'import 
    			prepCreatQimp.setInt(1,indImp.getGroupe().getQuestionnaire().getIdQuestionnaire());
    			prepCreatQimp.executeUpdate();
    			//Cretion d'une vue ayant les question du questio d'export
    			prepCreatQexp.setInt(1,indExp.getGroupe().getQuestionnaire().getIdQuestionnaire());
    			prepCreatQexp.executeUpdate();
    			//Creation d'une vue avec la jointure des deux selon une égalité entre leur code
    			prepCreatQjointure.executeUpdate();
     
    			//On copie les réponses de l'individu dans cette table temporaire
    			prepInsertRep.setInt(1,indExp.getId() );
    			prepInsertRep.executeUpdate();
     
    			//On change l'ID des l'individu
    			prepChangeIndRep.setInt(1,indImp.getId());
    			prepChangeIndRep.executeUpdate();
     
    			prepQRep.executeUpdate();
     
    			prepInsertIndQ.executeUpdate();
     
    			Statement statement = connexion.createStatement();
    			statement.executeUpdate("DELETE FROM REPONSE_TEMP");
    			statement.executeUpdate("DROP VIEW QJOINTURE");
    			statement.executeUpdate("DROP VIEW QIMP");
    			statement.executeUpdate("DROP VIEW QEXP");
     
     
    		}
    		catch(SQLException e)
    		{
    			e.printStackTrace();
    		}
    	}



    Sinon, bah je prepars la création des vu juste avant. Alors c'est vrai que je ne les executes pas, mais j'aurais pensé que ca allait quand même puisque je prepare la création de la vue "QJOINTURE " a partire des deux vues QIMP et QEXP qui ne sont pas executé.



    Et si tu executes cette requete dans ton editeur sql, elle fonctionne ou pas ?
    Je n'utilise pas d'éditeur SQL, mais quand j'executais directement les requetes sans les préparer avant, cela marchait sans aucun problème.

    Après test il semble que le problème vienne précisement de QJOINTURE, seulement je ne comprend vraiment pas pourquoi il serait necessaire d'executer la requete avant pour que la table soit créer ... Surtout que ca marche sans problème avec la création de la vue QJOINTURE qui utilise les deux vus QEXP et QIMP.

  5. #5
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    C'est où que tu as l'erreur exactement ?
    En Java, c'est bien de donner les stack et d'indiquer la ligne qui génère l'exception ...
    C'est sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prepQRep.executeUpdate();
    ?

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Je l'ai mis dans le premier post, c'est sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE REPONSE_TEMP SET T_Question_ID = ( SELECT QIMPID FROM QJOINTURE WHERE QJOINTURE.QEXPID=REPONSE_TEMP.T_Question_ID ) WHERE T_Question_ID IN ( SELECT QEXPID FROM QJOINTURE )

    J'ai effectuer de nouveau test, et de tout evidence ca vient bien du fait que je n'execute pas les requetes de création, je comprend vraiment pas comment cette préparation peut s'executer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PreparedStatement prepCreatQjointure = connexion.prepareStatement("CREATE VIEW QJOINTURE AS (SELECT QIMP.T_QUESTION_ID AS QIMPID, QEXP.T_QUESTION_ID AS QEXPID FROM QEXP, QIMP WHERE ( QEXP.CODEQUESTION=QIMP.CODEQUESTION) )");
    Alors que c'est idem, j'utilise dedans des vues qui n'existent pas ...

    Ce qui m'ennuie, c'est que au moment ou je les execute, là tout existera.
    Vu que, si j'ai bien compris, préparer des requetes consite juste à les compiler au préalable, puis à les executer plus tard. A ce moment, est ce que je peux dire, va y compile t'en fais pas si tu as l'impression quil ya des erreurs, au moment de l'execution tout ira bien ?

  7. #7
    Membre expérimenté Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Citation Envoyé par Djobird
    Sinon, bah je prepars la création des vu juste avant. Alors c'est vrai que je ne les executes pas, mais j'aurais pensé que ca allait quand même puisque je prepare la création de la vue "QJOINTURE " a partire des deux vues QIMP et QEXP qui ne sont pas executé...
    Surtout que ca marche sans problème avec la création de la vue QJOINTURE qui utilise les deux vus QEXP et QIMP.
    Je pense que cela dépend des drivers JDBC, mais en toute logique avant d'utiliser une vue il faut la créer, le simple fait de créer ta PreparedStatement ne suffit pas à créer ta vue en base de donnée.

    Hydraland

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo