Delimitadores de expresiones char

13/06/2006 - 10:33 por José Luis Capel | Informe spam
Hola a todos,

Tengo el siguiente problema (ejemplo simplificado):

cNomCli := "L'Hostal del Bon Menjar"
cSelect := "SELECT * FROM CLIENTES WHERE CNOMCLI = '" + cNomCli+"' ;"
oRs:Open(cSelect)

Esta secuencia me arroja un error de sintaxis dado que la variable cSelect
se expande como:

SELECT * FROM CLIENTES WHERE CNOMCLI = 'L'Hostal del Bon Menjar' ;

Mi pregunta es:

¿Hay alguna otra forma de delimitar las cadenas char? Por ejemplo, en xbase
podemos usar para estos casos los corchetes como delimitadores, quedando la
expresión como sigue:

SELECT * FROM CLIENTES WHERE CNOMCLI = [L'Hostal del Bon Menjar] ;

Sin embargo, esto no le gusta a SqlServer.

¿Alguna sugerencia?

Saludos y gracias,
José Luis Capel
PD: Estoy usando ADO con Xailer (www.xailer.com) y xharbour
(www.xharbour.org)

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
13/06/2006 - 14:05 | Informe spam
José Luis Capel,

Debes duplicar cada apostrofe dentro de la cadena.

cNomCli := "L'Hostal del Bon Menjar"



cNomCli := "L''Hostal del Bon Menjar"


AMB

"José Luis Capel" wrote:

Hola a todos,

Tengo el siguiente problema (ejemplo simplificado):

cNomCli := "L'Hostal del Bon Menjar"
cSelect := "SELECT * FROM CLIENTES WHERE CNOMCLI = '" + cNomCli+"' ;"
oRs:Open(cSelect)

Esta secuencia me arroja un error de sintaxis dado que la variable cSelect
se expande como:

SELECT * FROM CLIENTES WHERE CNOMCLI = 'L'Hostal del Bon Menjar' ;

Mi pregunta es:

¿Hay alguna otra forma de delimitar las cadenas char? Por ejemplo, en xbase
podemos usar para estos casos los corchetes como delimitadores, quedando la
expresión como sigue:

SELECT * FROM CLIENTES WHERE CNOMCLI = [L'Hostal del Bon Menjar] ;

Sin embargo, esto no le gusta a SqlServer.

¿Alguna sugerencia?

Saludos y gracias,
José Luis Capel
PD: Estoy usando ADO con Xailer (www.xailer.com) y xharbour
(www.xharbour.org)





Respuesta Responder a este mensaje
#2 José Luis Capel
13/06/2006 - 18:10 | Informe spam
Amb,

Muchas gracias por tu respuesta.


Debes duplicar cada apostrofe dentro de la cadena.

cNomCli := "L'Hostal del Bon Menjar"



cNomCli := "L''Hostal del Bon Menjar"




El caso es que en el siguiente código (es un ejemplo, puede tener
errores):

//- Código
LOCAL cSelect1, cSelect2
LOCAl oRsClientes, oRsDirecciones

cSelect1 := "SELECT cNombre FROM CLIENTES; "
oRsClientes := CreateObject("ADODB.Recordset")
oRsDirecciones := CreateObject("ADODB.Recordset")

oRsClientes:open(cSelect1)

oRsClientes:MoveFirst()
DO WHILE !oRsClientes:Eof()
cSelect2 := "SELECT * FROM DIRECCIONES WHERE cNombre =
'"+oRsClientes:cNombre+"';"
oRsDirecciones:open( cSelect2 )


oRsDirecciones:Close()
oRsClientes:MoveNext()
ENDDO
oRsClients:CLose()
//- Código

En este ejemplo, para abrir el recordset de direcciones debería hacer una
transformación de la columna oRsClientes:cNombre cambiando ' por ''.
Algo así:

cSelect2 := "SELECT * FROM DIRECCIONES WHERE cNombre = '"+STRTRAN
(oRsClientes:cNombre,"'","''")+"';"

Lo cual puede penalizar ligeramente el rendimiento. Pero lo preocupante
para mi es que además debería de hacerlo en todas las llamadas al método
Open del objeto Recordset dado que yo no puedo controlar que los usuarios
no introduzcan este tipo de caracteres.

Yo más bien pensaba que la solución podría pasar por decirle (de alguna
forma) a ADO o a SqlServer que los delimitadores van a ser otros. En
xharbour podemos usar indistintamente: [],"",'' como delimitadores de
cadenas.

Bueno, un saludo y gracias por todo.
José Luis Capel
PD: estoy usando xailer (www.xailer.com) con xharbour (www.xharbour.org)
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida