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

MS SQL Server Discussion :

problème apostrophes requetes SQL SERVER


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Par défaut problème apostrophes requetes SQL SERVER
    Bonjour , je dois maintenir et faire évoluer une application JAVA/SWING qui inter agit avec une base de données SQL SERVER.
    Le développeur n'avait pas pris en compte la gestion des apostrophes dans les requêtes.
    Du coup je suis un peu perdu.

    Sachant qu'il a créé une classe dédiée aux requêtes 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
    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
      public boolean executeQuery(String query, Vector data) {
     
     
            if (conn == null)
                return false;
     
            if (data == null) {
                data = new Vector();
            }
     
            try {
                log.debug("query: " + query);
     
                Statement stmt = conn.createStatement() ;
                ResultSet rs = stmt.executeQuery( query );
     
                int i = 0, max=0;
     
                // Loop through the result set
                while( rs.next() ) {
     
                    ResultSetMetaData rsmd = rs.getMetaData();
                    max = rsmd.getColumnCount();
    //                log.debug("number cols:" + max);
     
    // String s = i + ". ";
     
                    Vector row = new Vector();
                    for (int j=1; j<max+1; j++) {
                        row.add(rs.getString(j));
    // s += rs.getString(j) + ":";
                    }
                    data.add(row);
                    i++;
    // log.debug(s);
                }
     log.debug("rows: " + data.size());
                rs.close() ;
            }
            catch( SQLException se )
            {
                log.error( "SQL Exception:" ) ;
     
                  // Loop through the SQL Exceptions
                while( se != null )
                {
                    log.error( "State  : " + se.getSQLState()  ) ;
                    log.error( "Message: " + se.getMessage()   ) ;
                    log.error( "Error  : " + se.getErrorCode() ) ;
     
                    se = se.getNextException() ;
                }
                return false;
            }
            catch( Exception e )
            {
                 log.fatal("FATAL:", e);
                 return false;
            }
            return true;
        }
    J'avais pensé à utiliser la fonction replace de Java String.

    replace("'","''"); Mais le probleme c'est qu'en entrée je reçois des requetes toutes faites.

    exemple

    UPDATE TABLE SET CHAMP = 'VALUE'
    où la valeur peut être l'heure
    Si j'appelle le replace
    J'aurais au finale :

    UPDATE TABLE SET CHAMP = ''l''heure'' et qui ne marche pas.

    Existe-t-il une solution plus ad equate que de faire un String replace sur chaque chammp récupéré avant d'envoyer la requête ? merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    C'est une bonne idée de partir sur une fonction permettant d'ajouter les apostrophes, il faudra la distiller correctement au moment de la récupération du paramètre (donc avant la fonction ExecuteQuery), et pas sur la chaîne SQL complète
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Exemple :

    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
    --===========================================================================--      
    -- Ajoute les double quote à la chaine de caractères
    --===========================================================================--      
     
    CREATE FUNCTION dbo.F_SQLSTRING(@STR VARCHAR(max))
    RETURNS VARCHAR(max)
    AS
    /****************************************************************************** 
    * renvoie une chaine de car. avec quotes doublées et ajoutées axu extrémités  *
    ******************************************************************************* 
    * Fred. Brouard - http://sqlpro.developpez.com - www.sqlspot.com - 2009-04-30 * 
    ******************************************************************************/ 
    BEGIN
       RETURN '''' + REPLACE(@STR, '''', '''''') +'''';
    END;
    GO
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre expérimenté
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Par défaut
    Bonjour,

    POur éviter ce type de problème il est nécessaire de passer par une requête paramétrée en Java (cnx.prepareStatement) et non pas une requete sans paramètre. Avec le prepareStatement il n'y a plus de prablème d'apostrophe ou autre
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PreparedStatement rqt=cnx.prepareStatement("insert into maTable (nom, prenom) values (?,?)");
    rqt.setString(1, "Le nom");
    rqt.setString(2, "Le prénom");
    rqt.executeUpdate();

  5. #5
    Membre éclairé
    Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2007
    Messages : 439
    Par défaut
    oui à par filtrer les champs un à un avant l'envoi dans la requete UPDATE , je ne vois pas d'autres solutions.
    En effet en entrée , je reçois une chaîne

    var1 = l'heure
    UPDATE TABLE SET CHAMP = 'var1' ......

    Ce qui me donne ceci si j'applique la fonction replace que ce soit par SQL ou Java.

    UPDATE TABLE SET CHAMP = ''l''heure'' ce qui n'est pas le résultat voulu.

    La dernière solution étant le Preparred Statement mais la personne n'a pas développé l'application dans cette optique là.

Discussions similaires

  1. probléme de requete SQl dans une base SQL Server
    Par sasuma dans le forum Développement
    Réponses: 7
    Dernier message: 09/05/2009, 17h09
  2. [VB.NET] Problème de connexion à SQL Server
    Par Nesmontou dans le forum ASP.NET
    Réponses: 8
    Dernier message: 29/07/2005, 10h12
  3. probleme avec creation requete sql server
    Par Firas_tn dans le forum MS SQL Server
    Réponses: 19
    Dernier message: 15/04/2005, 12h12
  4. Problème Access to Sql Server
    Par vuldos dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/08/2004, 15h56
  5. Réponses: 3
    Dernier message: 18/11/2002, 16h36

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