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

Accès aux données Discussion :

COLLATE dans Filterexpression


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 207
    Points : 85
    Points
    85
    Par défaut COLLATE dans Filterexpression
    Bonjour,

    j'ai une textbox qui me permet de filtrer une DropDownList en ajoutant un filtre à la datasource de cette listbox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        protected void TB_FILTER_TextChanged(object sender, EventArgs e)
        {
            DS_PRODUIT.FilterExpression = " NOM_PRODUIT LIKE '%" + TB_FILTER.Text + "%'";
            DDL_PRODUIT.DataBind();
        }
    Le problème est que filtre ne prend pas en considération la collation de base qui est "COLLATE French_CI_AI"

    Si je rajoute cette collation n'importe où dans l'expression, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DS_PRODUIT.FilterExpression = " NOM_PRODUIT COLLATE French_CI_AI LIKE '%" + TB_FILTER.Text + "%'";
    J'ai une erreur "Missing operand after 'COLLATE' operator"

    Et si je rajoute la collation directement dans la datasource, cela ne change rien, pas d'erreur mais pas de collation, le filtre est sensible aux accents.

    Merci d'avance de vos réponses

    David

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu as essayé d'exécuter ta requête avec le COLLATE dans SSMS par exemple pour être sûr le contenu de FilterExpression est correct ?

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 207
    Points : 85
    Points
    85
    Par défaut
    Oui.
    Je suis sous SQL Server 2000
    Cette requête par exemple dans l'analyseur de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NOM_PRODUIT
    FROM PRODUITS
    WHERE NOM_PRODUIT LIKE '%métal%'
    ORDER BY NOM_PRODUIT COLLATE French_CI_AI;
    Fonctionne très bien. Je retrouve aussi bien des noms de produits contenant 'métal' ou 'metal' (sans accent)
    Mais la configuration du serveur SQL est de toute façon avec la bonne collation donc même si je ne spécifie pas le COLLATE French_CI_AI cela fonctionne pareil.

    De plus si j'indique cette même requête SQL directement avec la condition where en dur dans le datasource de mon aspx (avec ou sans COLLATE), le résultat est bien CI (Case Insensitive), j'obtiens bien des 'métal" ou des 'metal'

    C'est vraiment le DS_PRODUIT.FilterExpression qui ne tient pas compte de la collation de mon serveur SQL.
    Et si je veux forcer le COLLATE dans le FilterExpression ça indique l'erreur expliqué dans mon message.

    Est-ce que cela pourrait venir du contrôle TextBox dans lequel j'indique mon paramètre ("métal" par exemple) ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Après une petite recherche j'ai découvert qu'on pouvait mettre le COLLATE après la condition LIKE.
    Au lieu de : DS_PRODUIT.FilterExpression = " NOM_PRODUIT COLLATE French_CI_AI LIKE '%" + TB_FILTER.Text + "%'";il faut essayer la ligne suivante : DS_PRODUIT.FilterExpression = " NOM_PRODUIT LIKE '%" + TB_FILTER.Text + "%' COLLATE French_CI_AI ";
    D'après ton erreur FilterExpression s'attend à avoir une condition après le nom d'une colonne.

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 207
    Points : 85
    Points
    85
    Par défaut
    Il me semble que j'avais essayé de mettre le COLLATE après la condition LIKE.

    Je réessayerai après mes vacances.
    Merci !!

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 207
    Points : 85
    Points
    85
    Par défaut
    Bonjour
    Effectivement h2s84 j'avais bien testé cela et l'erreur est la même ""Missing operand after 'COLLATE' operator"
    Je ne comprend pas pourquoi ce FilterExpression retire la collation.

    On ne peut pas la forcer au niveau de la page aspx ou dans le web.config ?
    D'où cela peut-il venir ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par davelop Voir le message
    On ne peut pas la forcer au niveau de la page aspx ou dans le web.config ?
    D'où cela peut-il venir ?
    Non. Tu peux uniquement le forcer au niveau de la base de données (pour toutes les tables) ou au niveau d'une table. Une petite recherche sur le net te permettra de savoir comment via SSMS faire cette configuration

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 207
    Points : 85
    Points
    85
    Par défaut
    Mais comme je l'ai expliqué plus haut, la collation du serveur SQL est bonne. Elle l'a toujours été.

    D'ailleurs comme je l'explique aussi, dans le datasource de mon aspx, si j'indique en dur la clause "where nom_produit like...." la collation est bonne même sans spécifier.

    C'est vraiment le FilterExpression qui distingue les caractères accentués des caractères non-accentués saisie dans la TextBox.

  9. #9
    Membre régulier
    Inscrit en
    Juillet 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 207
    Points : 85
    Points
    85
    Par défaut
    J'ai même essayé en indiquant le FilterExpression dans le SqlDataSource comme indiqué ici : http://msdn.microsoft.com/fr-fr/libr...xpression.aspx
    mais le problème reste le même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        <asp:SqlDataSource ID="DS_PRODUIT" runat="server" ConnectionString="<%$ ConnectionStrings:cn_ref %>"
            ProviderName="<%$ ConnectionStrings:cn_ref.ProviderName %>" 
            SelectCommand="SELECT REFERENCE_Produit.ID_PRODUIT, REFERENCE_Produit.NOM_PRODUIT, REFERENCE_Produit.Description, REFERENCE_Produit.ID_TYPE_PRODUIT, REFERENCE_Produit.Valide, REFERENCE_PRODUIT_CHIMIQUE.CAS, REFERENCE_Produit.NOM_PRODUIT AS NOM_PLISTE FROM REFERENCE_Produit INNER JOIN REFERENCE_PRODUIT_CHIMIQUE ON REFERENCE_Produit.ID_PRODUIT = REFERENCE_PRODUIT_CHIMIQUE.ID_PRODUIT WHERE (REFERENCE_Produit.ID_TYPE_PRODUIT = ?)  ORDER BY REFERENCE_Produit.NOM_PRODUIT COLLATE French_CI_AI"
            FilterExpression="NOM_PRODUIT like '%{0}%'">
                    <FilterParameters>
                        <asp:ControlParameter Name="NOM_PRODUIT" ControlId="TB_FILTER"/>
                    </FilterParameters>
            <SelectParameters>
                <asp:ControlParameter ControlID="DDL_TYPE_PRODUIT" DefaultValue="-1" Name="ID_TYPE_PRODUIT"
                    PropertyName="SelectedValue" Type="Int32" />
            </SelectParameters>
        </asp:SqlDataSource>
    Et comme je disais, si je rajoute en dur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...AND NOM_PRODUIT like '%metal%'
    dans le SqlCommand, le resultat est bon cette fois, bien Case Insensitive.

    Comment faite vous pour filtrer des datasource vous ? J'ai l'impression d'être le 1er à avoir ce problème

Discussions similaires

  1. [MySQL] Utilisation de COLLATE dans une requète préparée
    Par STban94 dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 23/04/2015, 16h19
  2. a propos de COLLATE dans un ORDER BY
    Par dehorter olivier dans le forum SQL
    Réponses: 4
    Dernier message: 18/10/2010, 12h21
  3. TRUNC dans Filterexpression
    Par DeveloppeurWeb dans le forum ASP.NET
    Réponses: 2
    Dernier message: 15/09/2010, 17h38
  4. problème de "collation" dans une requête (sans JOIN)
    Par maibey dans le forum Développement
    Réponses: 2
    Dernier message: 03/06/2008, 09h53
  5. problème de "collation" dans un UNION
    Par bilb0t dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 15/06/2004, 12h12

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