Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-05-2017
TheRafa TheRafa is offline
Miembro
 
Registrado: abr 2005
Posts: 24
Poder: 0
TheRafa Va por buen camino
Preparar cadena para Sql

Hola compañeros,
Llevo unos días dándole vueltas al problema por el cual la siguiente función ha dejado de funcionar al pasar de delphi 3 a delphi XE6. Es una función que prepara las cadenas para poderselas pasar antes a un TwwQuery.sql, ahora a un TFDQuery.sql, antes cualquier cadena que le pasara la devolvía entre comillas simples para que luego el qry la interpretara, pero ahora con XE6, siendo la misma función me la devuelve entre comillas dobles. Me podeis ayudar a ver donde estoy metiendo la pata o que ha cambiado que desconozco. Muchas gracias de antemano y un saludo.

Código Delphi [-]
(*                        Preparar cadena para SQL                            *)

function CadenaSQL(const Cad: String): String;
var I: Integer;
    Aux: String;
begin
  Aux := '';

  for I := 1 to Length(Cad) do
    begin
      Aux := Aux+Cad[i];
      if Cad[i] = '''' then Aux := Aux+'''';
    end;

  Aux := trim(Aux);
  if CadenaVacia(Aux)
    then Aux := 'NULL'
    else Aux := ''''+Aux+'''';

  CadenaSQL := Aux;
end;

Última edición por roman fecha: 12-05-2017 a las 17:10:04. Razón: Colocar etiquetas [delphi]..[/delphi]
Responder Con Cita
  #2  
Antiguo 12-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.773
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Por favor, cuando incluyas código en tus mensajes usa las etiquetas adecuadas:


Saludos y gracias por tu colaboración
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 12-05-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.773
Poder: 27
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Prueba usar la función QuotedStr en lugar de la anterior.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 12-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.110
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por TheRafa Ver Mensaje
me la devuelve entre comillas dobles.
De entrada, hay que notar que no es lo mismo comillas dobles: " que dos comillas sencillas: ''. Y lo digo porque en tu código no hay de dónde salgan las comillas dobles.

Otra cosa es que no se entiende lo que quieres hacer pero casi estoy seguro que no lo estás haciendo de la forma correcta. Si lo que quieres es lidiar con valores en tu cadena SQL que contengan comillas (simples o dobles) para que el parser de SQL no se confunda, los motores y/o componentes de bases de datos suelen tener mejores maneras de tratar esto, como lo son el paso de parámetros o funciones que "escapan" caracteres especiales para SQL.

Yo te recomendaría revisar eso.

LineComment Saludos
Responder Con Cita
  #5  
Antiguo 30-05-2017
TheRafa TheRafa is offline
Miembro
 
Registrado: abr 2005
Posts: 24
Poder: 0
TheRafa Va por buen camino
Cita:
Empezado por roman Ver Mensaje
De entrada, hay que notar que no es lo mismo comillas dobles: " que dos comillas sencillas: ''. Y lo digo porque en tu código no hay de dónde salgan las comillas dobles.

Otra cosa es que no se entiende lo que quieres hacer pero casi estoy seguro que no lo estás haciendo de la forma correcta. Si lo que quieres es lidiar con valores en tu cadena SQL que contengan comillas (simples o dobles) para que el parser de SQL no se confunda, los motores y/o componentes de bases de datos suelen tener mejores maneras de tratar esto, como lo son el paso de parámetros o funciones que "escapan" caracteres especiales para SQL.

Yo te recomendaría revisar eso.

LineComment Saludos
Tienes razón queria decir dos comillas simples y no lo puedo meter a través de parámetros ya que lo que pretendo es formar un query en el que van metidos en ejecución los datos del cliente, si los meto directamente en el qry funcionan, ya que soy yo el que mete los datos entre comillas simples, el problema es al cargarlo en ejecución, que donde debe ir una comilla me mete dos comillas simples, pero si crees que no hay otra forma de hacerlo tendré que pensarlo. Lo que no puedo entender es que un sistema que funciona sin ningún problema deje de funcionar al cambiar de versión, por eso creo que podría haber algo que se me este escapando en el project options.
También he probado con la función QuotedStr como dice ecfisa y pasa exáctamente lo mismo, me dobla la comilla.
Bueno, muchas gracias por vuestro tiempo.
Responder Con Cita
  #6  
Antiguo 30-05-2017
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.110
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por TheRafa Ver Mensaje
el problema es al cargarlo en ejecución, que donde debe ir una comilla me mete dos comillas simples
Pero es que eres tú mismo quien mete la otra comilla:

Código Delphi [-]
for I := 1 to Length(Cad) do
    begin
        Aux := Aux+Cad[i];
        if Cad[i] = '''' then Aux := Aux+'''';
    end;

Si Cad[i] es una comilla, la línea

Código Delphi [-]
Aux := Aux+Cad[i];

la pone en Aux, PERO, la siguiente línea:

Código Delphi [-]
if Cad[i] = '''' then Aux := Aux+'''';

la vuelve a poner.

La verdad es que no tienes porqué agregar nada. En Delphi pones doble comilla simple para que el compilador entienda que es una comilla, ya que en pascal las cadenas van entre comillas simples. Pero esto sólo es necesario cuando escribes la cadena directamente en el código Delphi.

En tu función CadenaSQL, ya recibes una cadena y lo que deberías hacer con esas comillas sería, en todo caso, "escaparlas" con una diagonal \ o con el caracter de escape de tu manejador de bases de datos, pero no colocando una comilla extra porque éso sólo Delphi lo entiende, no el gestor de bases de datos.

Por otro lado, "escapar" tú mismo ese tipo de caracteres no es para nada recomendable. Por ello es que debes usar parámetros. Y cuando digo parámetros no mer refiero a valores que se pasen en tiempo de ejecución, sino a valores que se pasan a la sentencia SQL.

Algo así (aunque depende un poco de los componentes que uses para acceder a BD):

Código Delphi [-]
Query.SQL.Text := 'select * from usuario where nombre = :nombre';
Query.ParamByName('nombre').AsString := 'Donald';
Query.Open;

LineComment Saludos
Responder Con Cita
  #7  
Antiguo 31-05-2017
TheRafa TheRafa is offline
Miembro
 
Registrado: abr 2005
Posts: 24
Poder: 0
TheRafa Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Pero es que eres tú mismo quien mete la otra comilla:

Código Delphi [-]for I := 1 to Length(Cad) do begin Aux := Aux+Cad[i]; if Cad[i] = '''' then Aux := Aux+''''; end;


Si Cad[i] es una comilla, la línea

Código Delphi [-]Aux := Aux+Cad[i];


la pone en Aux, PERO, la siguiente línea:

Código Delphi [-]if Cad[i] = '''' then Aux := Aux+'''';


la vuelve a poner.

La verdad es que no tienes porqué agregar nada. En Delphi pones doble comilla simple para que el compilador entienda que es una comilla, ya que en pascal las cadenas van entre comillas simples. Pero esto sólo es necesario cuando escribes la cadena directamente en el código Delphi.

En tu función CadenaSQL, ya recibes una cadena y lo que deberías hacer con esas comillas sería, en todo caso, "escaparlas" con una diagonal \ o con el caracter de escape de tu manejador de bases de datos, pero no colocando una comilla extra porque éso sólo Delphi lo entiende, no el gestor de bases de datos.

Por otro lado, "escapar" tú mismo ese tipo de caracteres no es para nada recomendable. Por ello es que debes usar parámetros. Y cuando digo parámetros no mer refiero a valores que se pasen en tiempo de ejecución, sino a valores que se pasan a la sentencia SQL.

Algo así (aunque depende un poco de los componentes que uses para acceder a BD):

Código Delphi [-]Query.SQL.Text := 'select * from usuario where nombre = :nombre'; Query.ParamByName('nombre').AsString := 'Donald'; Query.Open;


LineComment Saludos
Hola, ya se que soy yo el que mete otra comilla, pero como he comentado antes en delphi5 funcionaba sin problemas, porque llegaba al qry con 2 comillas simples y lo entendía como texto, de hecho el QuotedStr hace exactamente lo mismo, eso es lo que me vuelve loco y no entiendo.
Voy a probar todo el tema con los parámetros y ya os contaré, si se os ocurre algo diferente comentarlo.
De nuevo, gracias por tu tiempo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Funciones para limpiar y buscar una cadena en otra cadena o en un fichero xaguilars Trucos 1 29-07-2007 22:20:14
Funcion para borrar la cadena que aparesca repetida dentro de otra cadena flystar Varios 1 02-07-2007 23:51:10
Funcion para buscar cadena dentro de otra cadena y el numero de veces flystar Varios 3 02-07-2007 22:48:08
Preparar BD sin dependencias Deiv Varios 10 24-01-2007 02:17:17
Preparar pagina en PReport ElCherchu Impresión 5 23-06-2003 16:15:52


La franja horaria es GMT +2. Ahora son las 18:25:33.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi