2010-10-20 4 views
22

J'utilise OData pour interroger ma base de données. La ligne de code suivante fonctionne correctement lorsque "adapterName" contient du texte.Comment faire pour échapper un seul guillemet à utiliser dans une requête OData?

ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, ''); 

Si "adapterName" contient un guillemet simple, il échoue. J'ai essayé d'échapper à la seule citation en utilisant le code suivant:

adapterName = adapterName.replace(/\'/g, '\\\''); 

Bien que cela échappe correctement le texte défini par l'utilisateur la fonction échoue encore. Quelqu'un peut-il me dire quel est le format correct pour le texte dans la requête?

+0

FIXE :) J'avais besoin de convertir le guillemet simple en guillemets doubles. – Retrocoder

+0

A noter: si vous utilisez le filtre de sous-chaîne et que la requête est déjà entre guillemets, vous devrez sortir avec 4 'et non 2. – chapmatic

Répondre

72

En fait,% 27 n'est pas une solution. La bonne façon d'échapper est de placer deux guillemets simples dans la chaîne au lieu d'un. Dans l'exemple "o''clock"

+6

+1. Remplacer 'with \' ou% 27 ne semble pas fonctionner avec la requête odata. Cela devrait être la réponse acceptée. – Mathieu

+1

Je suis entièrement d'accord,% 27 donne 400 mauvaise requête en raison de caractères non valides dans le chemin de requête. – jwendl

+0

La pression des pairs ici, cette solution fonctionne,% 27 émet des erreurs. –

0

Lorsque vous utilisez l'esprit substringof il doit être échappé en ayant 4 au lieu de 1 apostrophe:

a'b -> $filter=(substringof('a''''b', FirstName))

+0

Ceci est un commentaire à la réponse, pas la réponse – sehe

-1

Au lieu d'utiliser le filtre de $ = eq Titre 'text'

I J'utilise la fonction oData startswith().

filtre $ = startswith (titre, clé)

puis je passe autant de clés que je peux.

var pos = key.indexOf("'");
if(pos > -1) {
key = key.substring(0, pos);
}

5

Je veux élargir la réponse un peu pour que cela vaut aussi pour appeler une action Service Operation oData. La réponse affichée est correcte, mais il existe un ordre spécifique dans lequel les paramètres d'une opération de service doivent être codés.

oData Service des opérations de réception des paramètres de type primitif où les chaînes sont placées dans un « tel qu'une URL valide (pré encodage) sera en tant que tel

AddString? Valeur = » o''clock »

Cette provoquera le serveur pour voir

AddString? valeur = 'o'

et

'horloge'

produira "Requête incorrecte - Erreur dans la syntaxe de requête".

Pour corriger cela, vous devez double échapper le 'et UrlEncode avant l'insertion dans l'URL.

Ne pas UrlEncode l'URL elle-même.

Voici un exemple qui fonctionnera.

// value passed as "o'clock" 
public async Task AddString(string value) 
{ 
    // Escape ' with '' and UrlEncode value 
    value = HttpUtility.UrlEncode(value.Replace("'", "''")); 

    string url = String.Format("AddString?value='{0}'", value); 

    // No need to UrlEncode url here as dynamic content has already been escaped 

    // Execute ..... 
} 

[WebGet] 
public void AddString(string value) 
{ 
    // here value will be "o'clock" 
} 
Questions connexes