Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Preparar cadena para Sql (https://www.clubdelphi.com/foros/showthread.php?t=91839)

TheRafa 12-05-2017 15:30:56

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;

ecfisa 12-05-2017 17:10:01

Hola.

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


Saludos y gracias por tu colaboración :)

ecfisa 12-05-2017 17:47:09

Hola.

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

Saludos :)

roman 12-05-2017 17:47:25

Cita:

Empezado por TheRafa (Mensaje 516605)
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

TheRafa 30-05-2017 19:07:53

Cita:

Empezado por roman (Mensaje 516609)
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.

roman 30-05-2017 19:40:18

Cita:

Empezado por TheRafa (Mensaje 517386)
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

TheRafa 31-05-2017 17:06:07

Cita:

Empezado por roman (Mensaje 517389)
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.


La franja horaria es GMT +2. Ahora son las 22:54:59.

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