Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   buscar por campo que no es clave. (https://www.clubdelphi.com/foros/showthread.php?t=81847)

joaking 26-12-2012 00:33:09

buscar por campo que no es clave.
 
Buenas, pues como estoy empezando en lazarus, firebird y zeos tengo un primer problema.

He creado una tabla con codcliente,nombre. El problema está cuando quiero buscar por nombre me da un error sql error code = -206 ..... pero si busco por id(que es clave de la tabla) funciona correctamente.

ZQbnombre.SQL.text := 'select nombre from clientes where nombre = "pepe"'; (error)
ZQbnombre.SQL.text := 'select * from clientes WHERE codcliente = 2';
¿En las especificaciones del campo nombre tiene que tener algo para poder buscar luego en él?

Gracias.

ecfisa 26-12-2012 01:24:30

Hola joaking, bienvenido a Club Delphi :)

Según veo en tu sentencia:
Código Delphi [-]
  ZQbnombre.SQL.text := 'select nombre from clientes where nombre = "pepe"';
  ...
estas encerrando a pepe entre comillas dobles (") y tendrías que encerrarlo entre dos pares de comillas simples (' '):
Código Delphi [-]
  ZQbnombre.SQL.text := 'select nombre from clientes where nombre = ''pepe''';
  ...
También podrías hacer:
Código Delphi [-]
  ZQbnombre.SQL.text := 'select nombre from clientes where nombre = ' + QuotedStr('pepe');
  ...
Y mucho mejor pasando a pepe como parámetro:
Código Delphi [-]
  ZQbnombre.SQL.text := 'select nombre from clientes where nombre = :PNOMBRE';
  ZQbnombre.ParamByName('PNOMBRE').AsString := 'pepe';
  ...

Saludos.

joaking 26-12-2012 21:51:18

Gracias, Perfecto. Pero ahora complicándolo un poco más, este otro no me funciona correctamente.

Código Delphi [-]
  ZQbnombre.SQL.text := 'select * from clientes where upper(nombre) like'+QuotedStr('%'+bnombre.Text+'%');

bnombre.text ----- TEdit campo con el texto a buscar pero quiero que lo busque tanto si lo escribo en mayúsculas como en minúsculas sin saber como está metido en la tabla.

Muchas gracias.

ecfisa 26-12-2012 23:22:32

Hola joaking.

Cita:

quiero que lo busque tanto si lo escribo en mayúsculas como en minúsculas sin saber como está metido en la tabla.
Como ejemplo, una búsqueda incremental desde un Edit:
Código Delphi [-]
procedure TForm.bnombreChange(Sender: TObject);
begin
  ZQbnombre.Close;
  ZQbnombre.SQL.text := 'SELECT * FROM CLIENTES WHERE UPPER(NOMBRE) LIKE '+
    QuotedStr(UpperCase(bnombre.Text)+'%');
  ZQbnombre.Open;
end;

Pero, para evitar la inyección SQL, mucho mejor sería:
Código Delphi [-]
procedure TForm.bnombreChange(Sender: TObject);
begin
  ZQbnombre.Close;
  ZQbnombre.SQL.Text := 'SELECT * FROM CLIENTES WHERE UPPER(NOMBRE) LIKE :PNOMBRE';
  ZQbnombre.ParamByName('PNOMBRE').AsString := UpperCase(bnombre.Text)+'%';
  ZQbnombre.Open;
end;

Saludos. :)

joaking 27-12-2012 00:15:38

Perfecto para un campo de búsqueda. Mucho tengo que aprender de sql. La inyección SQL nunca se me hubiera ocurrido.

Muchas gracias.


La franja horaria es GMT +2. Ahora son las 16:36:00.

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