Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-10-2006
Avatar de voldemmor
voldemmor voldemmor is offline
Miembro
 
Registrado: ago 2006
Posts: 232
Poder: 18
voldemmor Va por buen camino
problema con ADOQuery y delphi6 (en una consulta sql)

Hola amigos tengo 1 problema.
Al realizar una consulta a una base de datos FireBird a una tabla DATOS
La ago usando un ADOQuery y la realizo por codigo:

Código Delphi [-]
 
DBFARMACIA.ADOConnection1.Open;
DbFarmacia.ADOQuery1.Open;
DbFarmacia.ADOQuery1.Active;
DbFarmacia.ADOQuery1.SQL.Add('select * from DATOS');  //aqui me da error
DbFarmacia.ADOQuery1.ExecSQL;
DbFarmacia.ADOQuery1.First;
edit1.Text:=DbFarmacia.ADOQuery1.Fields[0].AsString;
edit2.Text:=DbFarmacia.ADOQuery1.Fields[1].AsString;
edit3.Text:=DbFarmacia.ADOQuery1.Fields[2].AsString;
edit4.Text:=DbFarmacia.ADOQuery1.Fields[3].AsString;
edit5.Text:=DbFarmacia.ADOQuery1.Fields[4].AsString;
DbFarmacia.ADOQuery1.Close;
dbfarmacia.ADOQuery1.SQL.Clear;


al compilar me da estos errores y en línea de código marcado

-----------------------------------------------------------------
proyect farmac.exe raised exception class EOleExeption whit message 'dinamic sql error SQL error code = -104
Token unknown -line 2,char 1
select'. process stopped. Use steo or run to continue
------------------------------------------------------------------

Pero si omito esa línea de código y la sentencia SQL (‘select * from DATOS’), la escribo directamente en la propiedad SQL del ADOQuery mediante el inspector de objetos no me da error.

Es que no me agradaría tener demasiados querys en mi aplicación y no se cuales serian los problemas que surgirían en métodos como insertar y modificar en los que necesito mandar parámetros desde mi formulario.
Responder Con Cita
  #2  
Antiguo 10-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Antes de hacer el DbFarmacia.ADOQuery1.SQL.Add('select * from DATOS'); has un SQL.Clear:

Código Delphi [-]
DbFarmacia.ADOQuery1.SQL.Clear;
DbFarmacia.ADOQuery1.SQL.Add('select * from DATOS');

Otra opción es asignar el query mediante la propiedad Text de la propiedad SQL:

Código Delphi [-]
DbFarmacia.ADOQuery1.SQL.Text := 'select * from DATOS';


Saludos...
Responder Con Cita
  #3  
Antiguo 10-10-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Intenta esto:
Código Delphi [-]
DBFARMACIA.ADOConnection1.Open;
DbFarmacia.ADOQuery1.Active;
DbFarmacia.ADOQuery1.SQL.Text:= 'select * from DATOS';  
DbFarmacia.ADOQuery1.Open;
DbFarmacia.ADOQuery1.First;
edit1.Text:=DbFarmacia.ADOQuery1.Fields[0].AsString;
edit2.Text:=DbFarmacia.ADOQuery1.Fields[1].AsString;
edit3.Text:=DbFarmacia.ADOQuery1.Fields[2].AsString;
edit4.Text:=DbFarmacia.ADOQuery1.Fields[3].AsString;
edit5.Text:=DbFarmacia.ADOQuery1.Fields[4].AsString;
DbFarmacia.ADOQuery1.ExecSQL;
DbFarmacia.ADOQuery1.Close;
dbfarmacia.ADOQuery1.SQL.Clear;
A mi particularmente no me gusta usar ADD en cosas asi, el add es añadir, se entiende mejor si se usa para eso.
Saludos
Responder Con Cita
  #4  
Antiguo 10-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Código Delphi [-]
DbFarmacia.ADOQuery1.Open;
DbFarmacia.ADOQuery1.Active;
DbFarmacia.ADOQuery1.SQL.Add('select * from DATOS'); 
DbFarmacia.ADOQuery1.ExecSQL;
DbFarmacia.ADOQuery1.First

¿No estás haciendo las cosas un poco desordenadas? Lo digo porque aunque no falle, me parece que estás haciendo más cosas de la cuenta...

(1) Haces un Open y luego un Active ¿Eso no es redundante?
(2) Luego asignas el SQL ¿Eso no debería estar antes del Open/Active?
(3) Lo normal al añadir (como ya te han dicho) texto a la propiedad SQL, es limpiar lo que hay antes (Clear), porque si se pasa dos veces por ese punto, aunque la primera funcione, la segunda seguramente fallará.

Creo que deberías pensar detenidamente el código que tienes escrito e intentar entenderlo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 10-10-2006
Avatar de kyke_mx
kyke_mx kyke_mx is offline
Registrado
 
Registrado: abr 2006
Posts: 8
Poder: 0
kyke_mx Va por buen camino
Humilde opinion

Efectivamente tiene razon Neftali y ademas No debes usar AdoQuery.ExecSql; en una consulta, debes usar .open. ExecSql se usa para sentecias SQL Insert, Update y Delete.

A mi manera quedaria asi:

DbFarmacia.ADOQuery1.Close;
DbFarmacia.ADOQuery1.Sql.Clear;
DbFarmacia.ADOQuery1.SQL.Add('select * from DATOS');
DbFarmacia.ADOQuery1.Open;
DbFarmacia.ADOQuery1.First;

Responder Con Cita
  #6  
Antiguo 10-10-2006
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
Aver compañeros, hagamos la evaluación del código

Esta línea es correcta aúnque está de más ya que cuando abres una consulta
el componente query se encarga de establecer la conexión

DBFARMACIA.ADOConnection1.Open;

Estas dos líneas son incorrectas, ya que primero debes establecer el valor de la propiedad Sql del componente TAdoQuery

DbFarmacia.ADOQuery1.Open;
DbFarmacia.ADOQuery1.Active;

La mejor manera de establecer el valor de la propiedad Sql es de la siguiente manera:
DbFarmacia.ADOQuery1.SQL.Text := 'select * from DATOS'

La razón de ello es que no requieres invocar los métodos clean y close, :P ya que el primero se sobrescribe, y el segundo es disparado al ser modificada la propiedad.

Luego esta línea es incorrecta ya que como bien mencionan, las consultas que devuelven datos serán ejecutadas con Open

DbFarmacia.ADOQuery1.ExecSQL;

Esta línea está de más, ya que cuando ejecutas una consulta, ado coloca el cursor en la primera fila.
DbFarmacia.ADOQuery1.First;

Esta línea es correcta
DbFarmacia.ADOQuery1.Close;

Ateníendonos a lo comentado previamente, esta línea está de más.
dbfarmacia.ADOQuery1.SQL.Clear;


suerte
Responder Con Cita
  #7  
Antiguo 10-10-2006
Avatar de voldemmor
voldemmor voldemmor is offline
Miembro
 
Registrado: ago 2006
Posts: 232
Poder: 18
voldemmor Va por buen camino
gracias a todo.........

Bueno la verdad es que hace mucho tiempo no desarrollaba algun sistema y la primera vez que uso ADO. Eso no disculpa mi deshorden como lo dijo neftali, pero gracias a todos por sus respuestas esto me ha servido mucho y con sus consejos espero mejorar y optimizar en mucho mi codigo.
Ya voy a probar en este momento sus consejos y les traigo noticias
Responder Con Cita
  #8  
Antiguo 10-10-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Bueno y en conclusion que ?
Para mi la sentencia tendria que quedar asi:
Código Delphi [-]
DbFarmacia.ADOQuery1.SQL.Text:= 'select * from DATOS';  
DbFarmacia.ADOQuery1.Open;
edit1.Text:=DbFarmacia.ADOQuery1.Fields[0].AsString;
edit2.Text:=DbFarmacia.ADOQuery1.Fields[1].AsString;
edit3.Text:=DbFarmacia.ADOQuery1.Fields[2].AsString;
edit4.Text:=DbFarmacia.ADOQuery1.Fields[3].AsString;
edit5.Text:=DbFarmacia.ADOQuery1.Fields[4].AsString;
DbFarmacia.ADOQuery1.ExecSQL;
DbFarmacia.ADOQuery1.Close;
Suponiendo que la conexion esta hecha y activa.

Código Delphi [-]
DbFarmacia.ADOQuery1.ExecSQL;
Esto lo veo importante ya que si se usa el query en otra ocasion este tendra que estar vacio para llenarlo con otros datos, me parece una buena practica.
Saludos
Responder Con Cita
  #9  
Antiguo 10-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Caral, andas algo equivocado en cuanto a ExecSQL. Este método sirve para ejecutar sentencias que no devuelven registros, tales como Update, Insert y Delete...


Saludos...
Responder Con Cita
  #10  
Antiguo 10-10-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Maeyanes que bueno que me lo dices ya que lo uso por todos lados.
Voy a empezar a quitarlo, creia que dejaba el query limpio, bueno asi parecian sus siglas en ingles exec= escapar, sacar y sql, pues el sql.
Gracias por la aclaracion lo tomare en cuenta.
Saludos
Responder Con Cita
  #11  
Antiguo 10-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
En todo caso sería Exec = Execute = Ejecutar...

Y el método Clear de la propiedad SQL sirve para el propósito que imaginabas que hacía ExecSQL...


Saludos...
Responder Con Cita
  #12  
Antiguo 10-10-2006
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Gracias Maeyanes
El que diga que no aprende aqui, no ha visitado este club nunca.
Saludos y gracias Maestro.
Saludos
Responder Con Cita
  #13  
Antiguo 11-10-2006
Avatar de voldemmor
voldemmor voldemmor is offline
Miembro
 
Registrado: ago 2006
Posts: 232
Poder: 18
voldemmor Va por buen camino
gracias a todos ya he modificado todas mis consultas SELECT, les quiero molestar nuevamente si es posible que me ayudeis.

Podrias darme un ejemplo de como usar el ADOQuery con sentecias sql q usen parametros como bien lo an dicho (UPDATE, INSERT o DELETE) de antemano gracias
Responder Con Cita
  #14  
Antiguo 11-10-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por voldemmor
Podrias darme un ejemplo de como usar el ADOQuery con sentecias sql q usen parametros como bien lo an dicho (UPDATE, INSERT o DELETE) de antemano gracias
Haz una búsqueda en el ClubDelphi por "ADOQuery parametros" y obtendrás bastantes respuestas. Muchas de ellas tienen códio de ejemplo.

Un saludo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



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
consulta con un adoQuery manu Conexión con bases de datos 4 29-09-2006 00:17:48
Problema con AdoQuery marylobita Conexión con bases de datos 3 04-05-2006 19:17:54
Consulta sobre el componente ADOQuery s_e_montes Varios 2 02-02-2006 20:08:36
Problema con ADOQuery Sr.Scorpion Conexión con bases de datos 8 17-04-2005 20:53:02
Problema ADOQuery GIVO Providers 1 29-08-2003 17:30:58


La franja horaria es GMT +2. Ahora son las 15:20:16.


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
Copyright 1996-2007 Club Delphi