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

Taglibs Java Discussion :

[SQL] Conversion de données [JSTL]


Sujet :

Taglibs Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2002
    Messages : 11
    Points : 12
    Points
    12
    Par défaut [SQL] Conversion de données
    Bonjour,

    Essayant durement d'intégrer les notions de la JSTL en version 1.2, j'essaie d'écrire une petite application afin de tester les différents tag, dont ceux de la librairie SQL.
    Un bloquage cependant sur une instruction INSERT avec une conversion de donnée.

    J'ai une table de données, un schéma simple sous PostgreSQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    gihe=> \d ess.test
                  Table "ess.test"
     Column |          Type          | Modifiers
    --------+------------------------+-----------
     id     | bigint                 | not null
     nom    | character varying(250) |
    Un formulaire HTML me permet de saisir des données en relation avec la able de données.

    Le fichier saisie.jsp :
    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
     
    <!-- Fichier de saisie des paramètres-->
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
        <head>
        <title>Simple Example</title>
        </head>
        <body>
        <%@ include file='header.jsp' %>
        <c:set var="ess" value="test"/>
        <c:out value="${ess}"/>
     
        <form name="test" action="record.jsp" method="get">
            code: <input type="text" name="code"/>
            text: <input type="text" name="text"/>
            <input type="submit" name="ok"/>
        </form>
        </body>
    </html>
    Le fichier d'action record.jsp contient les instructions pour enregistrer les données dans la table via une requête SQL.

    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
     
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <html>
        <head>
        <title>Simple Example</title>
        </head>
        <body>
            <fmt:parseNumber var="ncode" value="${param.code}"/>
            <sql:setDataSource
                  driver="org.postgresql.Driver"
                  url="jdbc:postgresql://127.0.0.1/gihe"
                  user="gihe"
                  password="*******"
                  var="dataSource" />
            <sql:transaction dataSource="${dataSource}">
                <sql:update>
                    INSERT INTO ESS.TEST (ID,NOM) VALUES (?,?)
                    <sql:param value="${ncode*1})"/>
                    <sql:param value="${param.text}"/>
                </sql:update>
            </sql:transaction>        
        </body>
    </html>
    Le problème est que TOMCAT affiche un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    javax.servlet.ServletException: javax.servlet.jsp.JspException: 
                    INSERT INTO ESS.TEST (ID,NOM) VALUES (?,?)
     
     
                : ERROR: column "id" is of type bigint but expression is of type character varying
    J'ai bien essayé une conversion de type avec fmt:parseNumber sans résultat.

    Est-ce possible de convertir des données de cette manière, ou dois-je obligatoirement passer par une bean ?
    En passant par une servlet qui gère l'aspect données, ca devrait résoudre le problème, cependant, j'aimerai tout de même arriver à le faire ainsi.

    Merci de me mettre sur la piste si possible, je n'ai plus trop d'idée ....

    GiHe

  2. #2
    Membre régulier
    Homme Profil pro
    Responsable outils métier VIGS (Veolia)
    Inscrit en
    Septembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable outils métier VIGS (Veolia)
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 80
    Points : 87
    Points
    87
    Par défaut
    La seule manière d'effectuer cette manipulation serait de passer par des beans.
    C'est l'objet param qui pose problème et renvoie une valeur en caractère variable.

    Pouquoi la conversion de données avec les balises en fmt ne fonctionne pas ??? C'est une bonne question ...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2002
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Après un passage sur le site d'Oracle et un article très intéressant sur les JSTL et la réutilisation des fragments de code, je pense avoir trouvé une solution.

    Cette solution n'utilise cependant pas du tout les tag <sql:param>, donc je me demande en fait à quoi ils servent !!!

    Voici la solution mise en oeuvre :

    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
     
    <%@ taglib prefix="c"
    uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="sql"
    uri="http://java.sun.com/jsp/jstl/sql" %>
    <%@ taglib prefix="fmt"
    uri="http://java.sun.com/jsp/jstl/fmt" %>
    <html>
        <head>
        <title>Simple Example</title>
        </head>
        <body>
            <fmt:parseNumber var="ncode" type="number"
    value="${param.code*1}"/>
            <sql:setDataSource
                  driver="org.postgresql.Driver"
                  url="jdbc:postgresql://127.0.0.1/gihe"
                  user="gihe"
                  password="Dlm2ppedGiHe"
                  var="dataSource" />
            <sql:transaction dataSource="${dataSource}">
                <sql:update>
                    INSERT INTO ESS.TEST (ID,NOM) VALUES
    (${ncode},'${param.text}')
                </sql:update>
            </sql:transaction>        
        </body>
    </html>
    En fait il suffit d'insérer les tags directement dans la requête.
    Je pense que ceci n'est faisable qu'avec un container de JSP en 2.0 et les JSTL en norme 1.1 afin de bénéficier des nouveautés de la nouvelle spécification DES JSP 2.0 et du EL.

    Si quelqu'un peut valider mes dire et valider cette solution ou m'expliquer à quoi servent vraiment les tag <sql:param>

    Merci d'avance pour toute aide

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2002
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    En grattant un peu plus du côté du Driver JDBC de postgresSQL, je me suis apperçu que le problème provient d'un mauvais mapping des types de données entre JDBC et postgreSQL.

    En effet, le type integer de postgreSQL, peut-être du long est mal interprété et casté autrement. Comment je ne sais pas trop.

    J'ai changé de base et est effectué le même test sous MySQL, sans problème avec le même code en utilisant les balises <sql:param> et sans cast de données via les balises <fmt:parseNumber>.

    Donc le problème provient bien du driver JDBC de PostgreSQL.

  5. #5
    Membre régulier
    Homme Profil pro
    Responsable outils métier VIGS (Veolia)
    Inscrit en
    Septembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Responsable outils métier VIGS (Veolia)
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 80
    Points : 87
    Points
    87
    Par défaut
    Il faut utiliser les pilotes JDBC en version 7.3.

    On peut les télécharger içi
    http://jdbc.postgresql.org/download.html

    Télécharger la version 7.3 JDBC 3.

    Cela résout le problème.

    Bizarre cependant de devoir utiliser des pilotes JDBC de la 7.3 pour une version serveur en 8.0 ou 8.1 beta 1.

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

Discussions similaires

  1. [Pervasive.SQL]Base de données
    Par jidea dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 05/03/2007, 10h58
  2. SQL - Traiter des données d'une table
    Par david71 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/02/2005, 16h47
  3. [SQL] Base de données d'images - ajouter des métadonnées
    Par gandalf_le_blanc dans le forum Langage SQL
    Réponses: 10
    Dernier message: 29/06/2004, 19h52
  4. Génération de script SQL avec les données
    Par borgfabr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/03/2004, 13h57
  5. Transact Sql : Conversion de variable
    Par lord_paco dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/08/2003, 13h25

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