PDA

Ver la Versión Completa : buscar por campo que no es clave.


joaking
26-12-2012, 00:33:09
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:

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 (' '):

ZQbnombre.SQL.text := 'select nombre from clientes where nombre = ''pepe''';
...

También podrías hacer:

ZQbnombre.SQL.text := 'select nombre from clientes where nombre = ' + QuotedStr('pepe');
...

Y mucho mejor pasando a pepe como parámetro:

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.


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.

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:

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 (http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL), mucho mejor sería:

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.