Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   problema con ADOQuery y delphi6 (en una consulta sql) (https://www.clubdelphi.com/foros/showthread.php?t=36379)

voldemmor 10-10-2006 17:54:34

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.

maeyanes 10-10-2006 18:13:30

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...

Caral 10-10-2006 18:14:00

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

Neftali [Germán.Estévez] 10-10-2006 18:24:38

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.

kyke_mx 10-10-2006 18:52:42

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;


poliburro 10-10-2006 20:46:01

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

voldemmor 10-10-2006 21:43:21

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

Caral 10-10-2006 21:51:59

Bueno y en conclusion que ?:rolleyes:
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

maeyanes 10-10-2006 21:55:58

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...

Caral 10-10-2006 22:09:05

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

maeyanes 10-10-2006 22:20:14

En todo caso sería Exec = Execute = Ejecutar... :D

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


Saludos...

Caral 10-10-2006 22:28:58

Gracias Maeyanes
El que diga que no aprende aqui, no ha visitado este club nunca.
Saludos y gracias Maestro.
Saludos

voldemmor 11-10-2006 00:43:50

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

Neftali [Germán.Estévez] 11-10-2006 10:35:36

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.


La franja horaria es GMT +2. Ahora son las 22:55:30.

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