2010-10-20 23 views
22

Estoy usando OData para consultar mi base de datos. La siguiente línea de código funciona bien cuando "adapterName" solo contiene texto.¿Cómo escapar de una comilla simple para ser utilizada en una consulta de OData?

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

Si "adapterName" contiene una comilla simple, falla. He intentado escapar de la comilla simple usando el siguiente código:

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

Aunque esto escapa correctamente el texto definido por el usuario de la función sigue fallando. ¿Alguien puede decirme cuál es el formato correcto para el texto en la consulta?

+0

FIJO :) Necesitaba convertir la comilla simple en una comilla doble. – Retrocoder

+0

Para tener en cuenta: si utiliza el filtro de subcadena y la consulta ya está entre comillas, deberá escapar con 4 'no 2. – chapmatic

Respuesta

72

Actualmente% 27 no es una solución. La forma correcta de escapar es colocar dos comillas simples en la cadena en lugar de una. En el ejemplo "o''clock"

+6

+1. Reemplazar 'con \' o% 27 no parece funcionar con la consulta de odata. Esta debería ser la respuesta aceptada. – Mathieu

+1

Estoy totalmente de acuerdo,% 27 da 400 solicitudes incorrectas debido a caracteres no válidos en la ruta de solicitud. – jwendl

+0

Presión de grupo aquí, esta solución funciona,% 27 arroja errores. –

0

Al utilizar el ingenio substringof necesita ser escapado por tener 4 en lugar de 1 apóstrofe:

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

+0

Este es un comentario en la respuesta, no la respuesta – sehe

-1

En lugar de utilizar el filtro $ = Título eq 'texto'

I estoy usando la función oData startswith().

$ filter = startswith (Título, clave)

y luego me pase la mayor parte posible clave como pueda.

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

5

Quiero ampliar la respuesta un poco por lo que también se aplica a llamar a una operación de acción de servicio oData. La respuesta publicada es correcta, pero hay un orden específico en el que deben codificarse los parámetros de una operación de servicio. Operaciones

Servicio oData reciben parámetros de tipo primitivo, donde las cadenas se encierran en un 'tal que una URL válida (codificación pre) será como tal

AddString? Valor =' o''clock'

Este hará que el servidor para ver

AddString? valor = 'o'

y

'reloj'

producirá "Solicitud incorrecta - Error en la sintaxis de la consulta".

Para corregir esto, debe duplicar el escape de 'y UrlEncode it antes de insertarlo en la url.

No urlEncode la url sí mismo.

Aquí hay un ejemplo que funcionará.

// 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" 
} 
Cuestiones relacionadas