Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta SQL con Zeos (https://www.clubdelphi.com/foros/showthread.php?t=78858)

franroju 21-05-2012 20:14:54

Consulta SQL con Zeos
 
Hola gente. Tengo un problema que seguramente debe ser estupido pero estoy tan ciego que no veo la solucion.

Tengo una conexion zeos con mysql 5.1. Quiero hacer un simple select con 2 parametros y me arroja un error en la sintaxis de la consulta.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
     sql: string;
begin
  query.Close;
  query.SQL.Clear;
  sql := 'select * from usuarios where usuario = :usu  and contrasenia = :contra';
  query.SQL.Add(sql);
  query.ParamByName('usu').AsString:= edit1.Text;
  query.ParamByName('contra').AsString:= edit2.Text;
  query.Open;
end;

El error es "cerca" de 'usuarios' (nombre de la tabla) y me manda a revisar el manual, je (cosa que hice, pero no encuentro nada raro).

La conexion esta hecha de la siguiente manera: tengo un ZQuery con la propiedad Connection con el ZConnection, y un Datasource con la propiedad Dataset seteado con el ZQuery.

Espero puedan ayudarme, abrazo a todos

kapcomx 22-05-2012 02:02:11

tabla
 
mmmmmm no parece nada raro, estas seguro que tu tabla se llama "usuarios" . Los nombres de los campos son correctos???

en la propiedad SQL de tu query no le metiste alguna otra consulta.

Saludos....:cool:

darkbits 22-05-2012 15:40:31

Hola Compare mira en vez de select tendria que ir INSERT
ojo el ID_Primario de tu tabla USUARIOS dendria que ser auntoincremento. tomaencuenta el detalle.

tengo este SQL que lo utilizo para lo mismo q vos y me funciona de maravilla MD5 utilizo para encriptar el password par mas seguridad.

Código SQL [-]
     query.close;
     query.SQL.Text:='INSERT INTO usuarios(usuario,contrasenia) values ('+QuotedStr(edit1.text)+','+QuotedStr(MD5DigestToStr(MD5String(edit2.text)))+')'; // MD5 si quieres encriptar las contraseña de lo contrario como coloco el edit1.text
     query.ExecSQL;

franroju 23-05-2012 18:20:57

kapcomx los nombres están bien. No se, sigo sin encontrarle respuestas.

Amigo darkbits, yo no necesito un insert, los datos ya están en la base. Lo que quiero es corroborar si los datos ingresados en los edits son correctos chequeando la base. Por eso necesito el select.

Gracias a los 2 por responder, pero no he avanzado!

gmontes 23-05-2012 19:57:31

yo trabajo con zeos y firebird y esto hago

Código:

Close;

    DMSIU.cdsMedicos.Active:=false;
    SQL.Clear;
    SQL.Add('SELECT * FROM Medicos WHERE 1=1');
    case rdgBuscar.ItemIndex of
    0:SQL.Add(' AND nombre LIKE ''%'+txtNombreBusq.Text+'%''');
    1:SQL.Add(' AND rfc STARTING '''+txtRfcBusq.Text+'''');
    end;
    case rdgOrden.ItemIndex of
    0:SQL.Add(' ORDER By nombre');
    1:SQL.Add(' ORDER BY RFC');
    end;
    Open;
    DMSIU.cdsMedicos.Active:=true;

otro ejemplo es


Código:

Close;
    SQL.Clear;
    DMSIU.cdsFac.Active:=false;
    sql.add('select f.clavef, f.documento, f.remision, c.nombre, f.fechae, f.paciente, f.estatus, f.importet, f.condicion, f.sustitu, f.sdoc, fechacan');
    sql.add('from facturas f, clientes c where f.tipo =''F'' and SUBSTRING(f.documento from 1 for 1) = ''A'' and f.clavec = c.clavec and '+sCampo+' Like ''%'+Edit1.Text+'%'' ORDER BY f.documento DESC');
    Open;

algunos pasos de parametros estan muy a fuerzas, pero no me he tomado el timpo de corregir eso :o

Casimiro Notevi 23-05-2012 20:10:59

Copia el mensaje de error aquí :)

kapcomx 23-05-2012 23:07:12

ke raro
 
franroju, he checado fisicamente la consulta como la pusiste y me funciona bien la prueba la hice en D7 y Mysql 5......
tal vez si seria bueno ver tu codigo o como bien dice Casimiro poner el mensaje tal cual te aparece.

Saludos:confused:

franroju 24-05-2012 14:02:12

Gente, copio error.

Primero me aparece lo siguiente:

"Source File not found: ZDbcMySqlUtils.pas"

Y si a ese error le pongo Cancelar o Ignorar me dice lo siguiente:

"Project Proyect1.exe raised exception class EZSQLException with message 'SQL error: You have an error in your sql syntax; check the manual that corresponds to your MySql server version for de right syntax to use near 'LIKE 'usuarios'' at line 1'. Process stopped... bla bla".

Será algún fallo de instalación de Zeos?

Repito el código para refrescar la memoria:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
     sql: string;
begin
  query.Close;
  query.SQL.Clear;
  sql := 'select * from usuarios where usuario = :usu  and contrasenia = :contra';
  query.SQL.Add(sql);
  query.ParamByName('usu').AsString:= edit1.Text;
  query.ParamByName('contra').AsString:= edit2.Text;
  query.Open;
end;

Gracias por responder, y espero solucionarlo (o que me ayuden a hacerlo, je)!

Casimiro Notevi 24-05-2012 14:21:42

Cita:

Empezado por franroju (Mensaje 433409)
"Source File not found: ZDbcMySqlUtils.pas"

Pero ¿lo tienes?.

jpgonzalez 24-05-2012 15:00:53

Cita:

Empezado por franroju (Mensaje 433409)
Gente, copio error.

Primero me aparece lo siguiente:

"Source File not found: ZDbcMySqlUtils.pas"

Y si a ese error le pongo Cancelar o Ignorar me dice lo siguiente:

"Project Proyect1.exe raised exception class EZSQLException with message 'SQL error: You have an error in your sql syntax; check the manual that corresponds to your MySql server version for de right syntax to use near 'LIKE 'usuarios'' at line 1'. Process stopped... bla bla".

Será algún fallo de instalación de Zeos?

Repito el código para refrescar la memoria:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
     sql: string;
begin
  query.Close;
  query.SQL.Clear;
  sql := 'select * from usuarios where usuario = :usu  and contrasenia = :contra';
  query.SQL.Add(sql);
  query.ParamByName('usu').AsString:= edit1.Text;
  query.ParamByName('contra').AsString:= edit2.Text;
  query.Open;
end;

Gracias por responder, y espero solucionarlo (o que me ayuden a hacerlo, je)!


Hola franroju...
Yo te diría lo siguiente, copia la consulta y metela en el cliente MySQL que tengas (SQLYog, Workbench, etc)...
Si la consulta ahi funciona bien, es que el problema esta con el componente Zeos en algun lado... De esta manera descartas que el error sea de la sentencia MySQL...
Abrite el cliente MySQL y pone: select * from usuarios where usuario = 'usuario' and contrasenia = 'contraseña'.
Si eso te arroja resultados, revisa el componente Zeos.

Respecto de Zeos, cuando yo lo comence a usar me tiraba un error por no tener la libreria libmysql.dll. Fijate de tener esta libreria en C:\Windows\System.
Luego Revisa que este apuntando a la base correcta, y que tenga el root, password y procotol correcto.

Espero te sirva, Abrazo!!!!

jpgonzalez 24-05-2012 15:05:15

Cita:

Empezado por Casimiro Notevi (Mensaje 433412)
Pero ¿lo tienes?.

Respecto a lo que te comenta Casimiro, fijate de tener las carpetas de Zeos en el LibraryPath.
Por lo que dice ahi, no encuentra el punto pas, y eso puede ser porque no tener las carpetas agregadas en el libraryPath y/o no tenes agregada la variable de entorno de windows.
Te dejo un link que explica como instalar Zeos... Revisa si hiciste todos los pasos al instalar Zeos en tu Delphi.

http://www.youtube.com/watch?v=1jfhvkCFI4I

Espero te sirva, abrazo!!!

franroju 24-05-2012 19:04:14

Gente, lo solucione cambiando el query.Open por query.ExecSQL.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);

begin
  query.Close;
  query.SQL.Clear;
  query.SQL.Add('select * from usuarios where usuario = :usu and contrasenia = :contra');
  query.ParamByName('usu').AsString:= edit1.Text;
  query.ParamByName('contra').AsString:= edit2.Text;
  query.ExecSQL;
end;

El tema ahora es que no me "levanta" el registro, pero al menos no tira error je. Tienen idea que puede ser? Hago un fetchRow del query y me da 0. Error de tipeo no hay jeje.

Y ya que estoy hago otra consulta. Para acceder a los datos que me devuelve la consulta, debo hacerle un Open al query?? Porque es la función que me arroja el error.

jpgonzalez muy bueno el video... de dónde bajaron uds. las librerías Zeos? Yo tengo la versión 6.6.6 estable y tiene los paquetes hasta delphi 9, y el del video tiene hasta el 15!

Gracias, espero no molestarlos mas jaja. Un abrazo

franroju 25-05-2012 20:47:00

Gente, borre todo, y volvi a instalar todo, esta vez como dice el video. Pero sigo sin poder hacer un Open de un query o una tabla. Me sigue arrojando el mismo error de sintaxtis en la consulta. Me frena mucho este inconveniente, no puedo acceder a los datos que consulto!!

Por favor si pueden seguir ayudandome se los agradezco!

kapcomx 25-05-2012 23:12:59

intentar...
 
ke tal amigo franroju que tal si intentas hacer tu consulta de esta forma:

Código Delphi [-]
 
begin
  query.Close;
  query.SQL.Clear;
  query.SQL.Add('select * from usuarios where usuario = '+'"'+edit1.text + '"'+' and contrasenia ='+ '"' + edit2.text +'"');
  query.ExecSql;
  query.Open;
end;

Saludos...:cool:

franroju 26-05-2012 15:37:10

No, tampoco funciona. El problema es solo con las query. Ni active ni open funcionan. Las tablas andan bien.

AzidRain 26-05-2012 21:45:30

A reserva de que como casi siempre me caigan a palos por regañón (y otras cosas...):

En primer lugar si prestamos atención (un poquito) al mensaje de la excepción
Cita:

SQL error: You have an error in your sql syntax; check the manual that corresponds to your MySql server version for de right syntax to use near 'LIKE 'usuarios'' at line 1'
Vemos que la excepción NO es generada por Zeos sino por el motor de bd (MySQL en este caso), Zeos lo único que hace es mostrar el error que el motor le devolvió.

Segundo:
El mensaje:
Cita:

"Source File not found: ZDbcMySqlUtils.pas"
Es debido a que el consultante está depurando dentro del IDE por lo que éste trata de encontrar la instrucción que generó el error, pero dado que no se indicó un PATH para el código fuente de Zeos entonces no hay forma de mostrarlo. Recordemos que no es necesario contar con los fuentes para hacer que un paquete funcione. Si fuera un problema de Zeos, simplemente nuestro amigo no hubiera podido instalar los componentes.

Tercero:
Regresando a la excepción arrojada por el programa notamos que el motor se está quejando de una consulta que incluye un "LIKE":
Cita:

'LIKE 'usuarios''
La consulta de que sospecha nuestro amigo no contiene ningun LIKE, ergo, la consulta que provoca el error se encuentra en algún otro lado de su proyecto.

Solución:

Hay que buscar en todos los TZQuery para encontrar cual contiene la instrucción citada, posteriormente hay que verificar que no se haya dejado por error (casi a nadie le pasa [sarcasmo incluído]) con la propiedad "Active=TRUE" en tiempo de diseño ya que en esos casos Delphi abre la consulta de manera automática aunque no hagamos un "Open".

Finalmente, parece que en el query al que nuestro amigo hace un Open, tienen algunas instrucciones en su evento BeforeOpen o bien AfterOpen que abren otra consulta que es la que provoca el error. Por lo que pareciera que el error sucede al hacer "Open" en el query citado.



Finalmente, una aclaración respecto a ExeclSQL y Open:

ExecSQL por definició no devolverá datos ya que está diseñada para ejecutar consultas que no lo hacen como INSERT, DELETE o UPDATE sin que esto quiera decir que no podamos ejecutar un SELECT, salvo que los datos devueltos no son tomados en cuenta pues como ya mencioné, ExecSQL no espera que le devuelvan nada.
Open, por su parte SI es la que se debe utilizar para ejecutar un SELECT.

franroju 28-05-2012 15:20:05

Estimado amigo AzidRain: Gracias por la explicación detallada, pero lamento informarte que toda la descripción no me solucionó el problema.

En lugar de revisar query por query, mirando si estaba la propiedad Active = true desde diseño, o si había alguna sentencia sql que se ejecute en algún lugar extraño, o si había algo en la propiedad BeforeOpen o AfterOpen, hice algo mas sencillo y menos laborioso, que fue crear un proyecto nuevo, una base de datos nueva con una sola tablita, agregué y configuré las componentes de Zeos como siempre y tomando las precauciones que me marcaste, use un ZQuery para insertar un registro (no hubo problema) y un ZReadOnlyQuery para hacer un select. Luego de ejecutar la consulta, le pongo active = true y no hubo dramas, pero al hacer un Open murió, otra vez el mismo error: 'LIKE 'nombredelatabla''. Pongo "nombredelatabla" porque ocurre con cualquier tabla que tenga, y con cualquier consulta. Le ponga apostrofe invertido, comillas simples, dobles o nada.

Así que no se, estoy a punto de rendirme, je. O dejar Zeos :(.

Si quieren seguir colaborando será bienvenido.

Saludos.

franroju 29-05-2012 06:22:37

Y un día dios me ilumino, y gracias al MySql Command Line Client descubrí el error. Simplemente había que especificar en la consulta, el nombre de la base de datos! :eek:, de la siguiente manera:

Código SQL [-]
select * from nombredelabase.usuarios;

Gracias a todos igual, ya estaba colgando los botines, je.

Abrazo


La franja horaria es GMT +2. Ahora son las 11:15:07.

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