2010-10-20 13 views
22

Sto usando OData per interrogare il mio database. La seguente riga di codice funziona correttamente quando "adapterName" contiene solo testo.Come sfuggire a una singola quota da utilizzare in una query OData?

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

Se "adapterName" contiene una virgoletta singola non funziona. Ho provato a sfuggire alla sola citazione utilizzando il seguente codice:

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

Anche se questo sfugge correttamente il testo definito dall'utente la funzione non riesce ancora. Qualcuno può dirmi qual è il formato corretto per il testo nella query?

+0

FISSO :) Avevo bisogno di convertire la singola citazione in una doppia citazione. – Retrocoder

+0

Nota: se si utilizza il filtro di sottostringa e la query è già tra virgolette, sarà necessario uscire con 4 'non 2. – chapmatic

risposta

72

In realtà% 27 non è una soluzione. Il modo corretto per uscire è inserire due virgolette singole nella stringa invece una. Nell'esempio "o''clock"

+6

+1. Sostituire 'con \' o% 27 non sembra funzionare con la query odata. Questa dovrebbe essere la risposta accettata. – Mathieu

+1

Sono completamente d'accordo,% 27 dà 400 cattiva richiesta a causa di caratteri non validi nel percorso della richiesta. – jwendl

+0

La pressione dei pari qui, questa soluzione funziona,% 27 genera errori. –

0

Quando si utilizza il motto di spirito substringof ha bisogno di essere sfuggito da avere 4 invece di 1 apostrofo:

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

+0

Questo è un commento alla risposta, non la risposta – sehe

-1

Invece di utilizzare il filtro $ = Titolo eq 'testo'

I sto usando la funzione oData startswith().

$ filter = startswith (Titolo, chiave)

e poi mi passa in tanto di chiave che posso.

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

5

voglio estendere la risposta un po 'in modo che essa si applica anche a chiamare un odata Service Operation azione. La risposta posta risposta è corretta, ma esiste un ordine specifico in cui i parametri di un'operazione di servizio devono essere codificati. Operazioni

odata servizio di ricezione parametri di tipo primitivo in cui le stringhe sono racchiusi in un 'tale che un URL valido (codifica pre) sarà come tale

AddString? Value =' o''clock'

Questo farà sì che il server per vedere

AddString? value = 'o'

e

'orologio'

produrrà "Richiesta non valida - Errore nella sintassi della query".

Per correggere ciò, è necessario eseguire il doppio escape dell'URL e del codice Url prima dell'inserimento nell'URL.

Do not UrlInserire l'URL stesso.

Ecco un esempio che funzionerà.

// 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" 
} 
Problemi correlati