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

Langage SQL Discussion :

PB Délimiteur ' de chaine de caractères


Sujet :

Langage SQL

  1. #1
    Wln
    Wln est déconnecté
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut PB Délimiteur ' de chaine de caractères
    Bonjour à tous,

    J'utilise une base via ODBC en passant par des requetes et j'ai un pb quand il y a un ' dans une chaine de caractères.
    J'ai recherché (peut être pas assez bien) dans les posts précédent mais je n'ai rien trouvé de concluant.
    Concretement mon prg génère du code SQL ex :

    Select * from table where nom = 'L EQUIPE' -> cela fonctionne
    mais quand le nom saisie dans une combo est L'EQUIPE le SQL generé :
    Select * from table where nom = 'L'EQUIPE' -> ne fonctionne plus.

    J'ai bien essayé de doubler voir tripler (conseils donnés dans des posts) mais
    Select * from table where nom = 'L''EQUIPE' cela donne LEQUIPE donc pas de données trouvées et tripler fait planter.

    Dans cette base (je m'appuie dessus mais elle ne m'apartient pas) il y a bien un L EQUIPE et un L'EQUIPE avec des lignes dans des tables attachées pour chacun de ces noms. Je ne peux donc pas simplifier en enlevant tous les caractères (styles -/'espace*...) sinon je me retrouve avec toutes les lignes des tables attachées confondues.

    Donc peut on substituer un autre caractère à ' pour délimiter les chaines de caractères. Ou d'autres solutions ???

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    J'ai pas trop compris c'est du sql, ou du vb que tu fais... si c'est du sql tu peux utiliser des guillemets.

    Enfin ça serait mieux si tu nous montrais ton code avec tes requêtes...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    J'ai pas trop compris c'est du sql, ou du vb que tu fais... si c'est du sql tu peux utiliser des guillemets.

    Enfin ça serait mieux si tu nous montrais ton code avec tes requêtes...

  4. #4
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut

    tu as essayé en mettent un \ devant ta chaine de caractère :

  5. #5
    Wln
    Wln est déconnecté
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Je travaille sous Windev en attaquant une base par odbc mais ce n'est pas la partie Windev qui débloque.
    pour faire simple : j'ai une fenetre avec une combo alimenté par une table style select nom from table1 ---> ok

    l'utilisateur selectionne l'élément qu'il désire dans la combo

    avec cet élément selectionné je crée (en chaine de caractere avant de la soumettre à l'odbc) une 2éme requete du type :

    "Select info1, info2 from table2, table1
    where table2.id_table1 = table1.id_table1
    and table1.nom = '"+ValeurDeLaCombo+"'"

    ce qui donne par exemple :
    Select info1, info2 from table2, table1
    where table2.id_table1 = table1.id_table1
    and table1.nom = 'L EQUIPE' -----> cela fonctionne parfaitement

    Mais si jamais dans la combo l'élément selectionné possède un ' cela donne par exemple :
    Select info1, info2 from table2, table1
    where table2.id_table1 = table1.id_table1
    and table1.nom = 'L'EQUIPE' -----> la çà plante. Pour lui le texte c'est : 'L' et il n'interprete pas le reste : EQUIPE'. Cest normal puisqu'il a trouver ses 2 délimiteurs '

    Donc ma question : sachant qu'il me faut garder le ' dans ma recherche pour les raisons évoquées dans mon premier post, peut-on remplacer les délimiteurs ' standards en sql par un autre symbole

    Merci pour votre aide

  6. #6
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    avant de faire la requête SQL tu peux remplacer le ' par un caractère précis style '#' ou bien le doubler ''. (Cela marche avec SQL Server).

    Désolé si cela ne repond pas à ta question.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 154
    Points : 76
    Points
    76
    Par défaut
    le premier réflexe me semble être d'essayer en mettant un \ devant ton '

  8. #8
    Wln
    Wln est déconnecté
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci à vous Kayan, trotters213, TheRussian et Niko8181

    pour info avec les guillemets ex :
    Select * from table1 where table1.nom = "L'EQUIPE" --> ne fonctionne pas car c'est une constante et non une colonne (il ne trouve pas cette colonne)

    avec un \ devant ex :
    Select * from table1 where table1.nom = \'L'EQUIPE' génère un message d'erreur

    avec 2 ' ex :
    Select * from table1 where table1.nom = 'L''EQUIPE' CA MARCHE j'avais déjà vu cette réponse mais je ne l'avais pas compris. Actuellement l'Odbc pointe bien sur une base SQL serveur mais est-ce que cela fonctionne avec toutes les base ???

    et l'histoire du # je n'ai pas bien compris. TheRussian, si tu pouvais m'eclairer par un exemple sur ce point juste pour info.


    MERCI ENCORE

  9. #9
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    il voulait te dire de faire transformer L'EQUIPE en L#EQUIPE (enfin si j'ai bien compris)
    PS : pense au tag [Resolu] en bas à gauche si ton pb est résolu

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 154
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par Wln
    avec un \ devant ex :
    Select * from table1 where table1.nom = \'L'EQUIPE' génère un message d'erreur
    pas com ca, com ca :

    Select * from table1 where table1.nom = 'L\'EQUIPE'

    ds (presk) ts les languages le \ est un carac qui sert à "protéger" les carac spéciaux ...

  11. #11
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    Bien vu niko8181, j'avais même pas fait gaffe où il avait mis le \ (lol).
    Tu as confondu avec le PHP où tu le mets avant le nom de ton champ entre côtes si c'est un mot réservé par exemple et le SQL (entre autre) où tu utilises \ pour te servir de caractère "réservés" (ex : \\ \" \`).

  12. #12
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Wln
    avec 2 ' ex :
    Select * from table1 where table1.nom = 'L''EQUIPE' CA MARCHE j'avais déjà vu cette réponse mais je ne l'avais pas compris. Actuellement l'Odbc pointe bien sur une base SQL serveur mais est-ce que cela fonctionne avec toutes les base ???

    MERCI ENCORE
    Quand un délimiteur de champ 'String' est nclus dans une chaîne, il faut systématiquement le dédoubler afin qu'il ne soit pas considérer comme un délimiteur. Pour un séparateur quote, ça fonctionnera avec toutes les bases SQL.

    Voici une petit fonction (VB) utile pour les requêtes :
    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
     
     
    Public Function fzA(ByVal pvValeur As Variant) As String
    'Format Zone Alphanum
       Dim lniPos  As Integer
     
       lniPos = 1
       Do Until InStr(lniPos, pvValeur, "'") = 0
          lniPos = InStr(lniPos, pvValeur, "'")
          pvValeur = Left(pvValeur, lniPos) & "'" & Mid(pvValeur, lniPos + 1)
          lniPos = lniPos + 2
       Loop
       fzA = "'" & pvValeur & "'"
     
    End Function
    Ca t'encadre ta chaîne par des quotes et ça dédouble les quote qu'elle contient, très utile pour construire des requêtes à partir de VB

  13. #13
    Wln
    Wln est déconnecté
    Futur Membre du Club
    Inscrit en
    Mars 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci encore

    Juste pour info :
    Select * from table1 where table1.nom = 'L\'EQUIPE' provoque un message d'erreur
    et
    Select * from table1 where table1.nom = 'L#EQUIPE' ne retourne aucune ligne

    Mais les 2 ' fonctionnent très bien

    et moi pour rajouter ces 2 ' sous Windev j'ai une ch'tite fonction :
    remplace(MaVariable,"'","''")

  14. #14
    Membre actif Avatar de TheRussian
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 200
    Points : 241
    Points
    241
    Par défaut
    Quand je parlais de mettre un # c'était pour remplacer toutes les ' dans les tables, ainsi que dans les requêtes. De cette manière, la sélection faites lors de la saisie du critère de recherche fonctionne. Et on est plus gêné par les '. Mais bon c'est lourd à gérer car cela nécessite des pavés pour traité les chaines de caractères avant et après la requête.

    Mais bon ... c'est inutile puisqu'une autre méthode plus simple fonctionne

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Réponses: 3
    Dernier message: 31/08/2011, 15h20
  3. Réponses: 8
    Dernier message: 24/07/2007, 13h39
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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