PDA

Ver la Versión Completa : Problema con Insert y Update en ADOQuery


Moises22
29-12-2005, 11:15:54
Wenas a todos.

Tengo un problema cuando hago una insercion o un update. Resulta que hay una parte del programa que es casi repetida que usa UPDATE e INSERT, esta funciona correctamente, pues bien, en otra Unidad utilizo una instruccion muy parecida a la de la que me funciona bien pero me da un error diciendo que la sintaxis del INSERT INTO o del UPDATE (dependiendo de la opcion que elija) no es correcta.

Lo he revisado todo pero no doy con la solucion.Utilizo un DataModule con un AdoConnection para la conexion, y un en cada unidad un ADOQuery para las consultas e instrucciones. El codigo es el siguiente:

...

if (usuarioComboBox1.ItemIndex>0) then
begin
if (usuarioComboBox2.ItemIndexthen
ShowMessage('No puede asignar ese rango de usuario')
else
begin
if ((usuarioComboBox2.ItemIndex=userrango-1)and(id=userid))or
(usuarioComboBox2.ItemIndex>userrango-1) then
begin
usuarioADOQuery1.SQL.Clear;
try
usuarioADOQuery1.SQL.Add('Update usuarios set nombre='+
QuotedStr(usuarioLabeledEdit1.Text)+
',apellido1='+QuotedStr(usuarioLabeledEdit2.Text)+
',apellido2='+QuotedStr(usuarioLabeledEdit3.Text)+
',login='+QuotedStr(usuarioLabeledEdit4.Text)+
',password='+QuotedStr(usuarioLabeledEdit5.Text)+
',oficina='+intToStr(oficinaux)+' where Id='+intTostr(id));
//usuarioLabeledEdit1.Text:=usuarioADOQuery1.SQL.Text;
usuarioADOQuery1.ExecSQL;
finally
usuarioADOQuery1.Close;
usuarioADOQuery1.SQL.Clear;
end;
usuarioComboBox1Change(nil);
end
else
ShowMessage('No puede asignar ese rango de usuario');
end;
end
else
begin
usuarioADOQuery1.SQL.Clear;
try
usuarioADOQuery1.SQL.Add('Insert into usuarios(nombre,apellido1,apellido2,' +
'login,password,rango,oficina) values(' +
QuotedStr(usuarioLabeledEdit1.Text)+','+
QuotedStr(usuarioLabeledEdit2.Text)+','+
QuotedStr(usuarioLabeledEdit3.Text)+','+
QuotedStr(usuarioLabeledEdit4.Text)+','+
QuotedStr(usuarioLabeledEdit5.Text)+','+
intToStr((usuarioComboBox2.ItemIndex)+1)+','+
intToStr(oficinaux)+')');
usuarioADOQuery1.ExecSQL;
finally
usuarioADOQuery1.Close;
usuarioADOQuery1.SQL.Clear;
end;
usuarioLabeledEdit1.Text:='';
usuarioLabeledEdit2.Text:='';
usuarioLabeledEdit3.Text:='';
usuarioLabeledEdit4.Text:='';
usuarioLabeledEdit5.Text:='';

end;
end;


Espero que me puedan ayudar, muchas gracias por adelantado

delphi.com.ar
29-12-2005, 12:46:33
...me da un error diciendo que la sintaxis del INSERT INTO o del UPDATE (dependiendo de la opcion que elija) no es correcta...
Que pasa si pones un breakpoint antes del ExecSQL, copias el SQL y lo ejecutas en la consola del RDBMS???... Te da el mismo error?

Moises22
29-12-2005, 13:31:07
No he utilizado nunca la consola RDBMS, lo que si he utilizado es el breakpoint y en elvalucador de expreciones elijo el ExecSQl y me da el siguiente error Delphi exception EDatabaseError at $570F949 .

Pero si t sirve un poco, quite la el ExecSQL y capture la consulta, le puse un valo por defecto y en el access se lo añadi. El resultado fue perfecto.

Que me puede pasar???

delphi.com.ar
29-12-2005, 14:18:40
No he utilizado nunca la consola RDBMS
No me refiero a "la consola RDBMS", me refiero a la consola de tu base de datos que recien ahora me entero que es access. A lo que me refiero es a que captures el SQL y lo ejecutes en el editor de consultas de Access.


...he utilizado es el breakpoint y en elvalucador de expreciones elijo el ExecSQl y me da el siguiente error Delphi exception EDatabaseError at $570F949
La idea es que evelúes el valor del SQL no del ExecSQL!!!... y que copies la consulta!

...Pero si t sirve un poco, quite la el ExecSQL y capture la consulta, le puse un valo por defecto y en el access se lo añadi. El resultado fue perfecto.
A eso me refiero!... Pero que significa que le puesiste un valor por defecto??.. modificaste la consulta??.. no ejecutaste exactamente lo mismo que esta ejecutando tu aplicación??

Moises22
29-12-2005, 14:25:14
Yo hice una paso intermedio para ver como quedaba la sentencia SQL en un ShowMessage y la copie y pegue en la consola de consultas de access y funciono perfectamente, sin embargo en el programa me dice error de sintaxis SQL.

Espero alguien pueda ayudarme...:(

ContraVeneno
30-12-2005, 00:42:24
yo te recomendarias que uasaras un SQL.Add('...'); por cada línea de tu consulta, ya que si utilizas SQL.Add('...+...+..+...'); lo único que te dirá es que tienes un error en la línea 1. En cambio si utilizas SQL.Add(); por cada línea, te dirá exactamente en que línea tienes el error.

Moises22
30-12-2005, 09:45:55
He hecho lo que me has dicho y mas o menos como esperaba el error t dice que esta en la linea del usuarioADOQuery1.ExecSQL; :( . Sigo sin saber cual es el problema...

El codigo quedo asi:

usuarioADOQuery1.SQL.Clear;
try
usuarioADOQuery1.SQL.Add('INSERT INTO usuarios(nombre,apellido1,apellido2,login,password,rango,oficina) VALUES (');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit1.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit2.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit3.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit4.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit5.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(intToStr((usuarioComboBox2.ItemIndex)+1));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(intToStr(oficinaux));
usuarioADOQuery1.SQL.Add(')');
usuarioADOQuery1.ExecSQL;
finally
usuarioADOQuery1.Close;
usuarioADOQuery1.SQL.Clear;
end;


No sé, por deciros me queda que la tabla tiene un valor autoincremental que se llama id y que supongo que no influye en el problema. Tambien deciros que hay otra unidad que funciona practicamente igual y funciona perfectamente :(

Moises22
30-12-2005, 12:19:03
He conseguido que por lo menos funcione, pero no de la manera que yo quiero. La cosa esta en que hay un campo que es de auto incremento, si yo la insercion la hago asi:

usuarioADOQuery1.SQL.Clear;
try
usuarioADOQuery1.SQL.Add('INSERT INTO usuarios VALUES(');
usuarioADOQuery1.SQL.Add('5,');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit1.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit2.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit3.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit4.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit5.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(intToStr((usuarioComboBox2.ItemIndex)+1));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(intToStr(oficinaux));
usuarioADOQuery1.SQL.Add(')');
usuarioADOQuery1.ExecSQL;
finally
usuarioADOQuery1.Close;
usuarioADOQuery1.SQL.Clear;

me funciona pero claro yo quiero que me en vez del valor 5 coja el valor del autoincremento, que seria asi:

usuarioADOQuery1.SQL.Clear;
try
usuarioADOQuery1.SQL.Add('INSERT INTO usuarios(nombre,apellido1,apellido2,login,password,rango,oficina) VALUES(');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit1.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit2.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit3.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit4.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit5.Text));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(intToStr((usuarioComboBox2.ItemIndex)+1));
usuarioADOQuery1.SQL.Add(',');
usuarioADOQuery1.SQL.Add(intToStr(oficinaux));
usuarioADOQuery1.SQL.Add(')');
usuarioADOQuery1.ExecSQL;
finally
usuarioADOQuery1.Close;
usuarioADOQuery1.SQL.Clear;


PUES BIEN ESTA ULTIMA FORMA QUE ES LA QUE QUIERO Y NECESITO NO FUNCIONA DICE QUE HAY UN ERROR DE SINTAXIS SQL EN INSERT INTO.:eek:

Por favor necesito que alguien me heche una mano :confused:

lucasarts_18
30-12-2005, 14:32:58
Hola: Un consejo para que tengas un mejor orden: Pasa todo a varibles locales, así te evitas de poner directamente los controles en tu Insert Into del objeto Query. Además si es un valor de autoincremento debes dejarselo a la propia BD que lo genere y no tomarlo tú mismo. Trata de ordenarte un poco en el código y una buena forma creo yo, es asignar los valores a variables locales.. Además ,¿ por qué usas QuotedStr ?, si son String, pasalos como String, es decir ya vienen con apostrofes (todos los tipos string). Hasta Luego

ContraVeneno
30-12-2005, 16:27:07
Si vas a pasar un string, lo tienes que pasar entre comillas, o apóstrofes para el caso de SQL; por lo que el quotedstring esta correcto.

Mencionas que el error que te manda es un error de sintaxis de SQL. ¿Me podrías decir en que línea te dice que esta el error? ¿Podrías poner el mensaje exacto que te manda?

Y si le pones nombre representativos a tus controles, creéme que te irá mucho mejor. Es mejor leer un código como
" Nombre:=edtNombre.Text " que uno como "Nombre:=Edit1.Text" ; tal vez con 5 o 6 controles no tengas problema, pero conforme vayan aumentando creeme que vas a llegar al punto donde Edit23.Text no sabes ni cuál es, ni donde esta.

vtdeleon
30-12-2005, 16:30:59
Saludos

Por lo que veo,

- El primer codigo, el 5 es integer para SQL.
- El segundo codigo, QuotedStr(usuarioLabeledEdit1.Text) es String en SQL.

Creo que debes quitar el Quotedstr

vtdeleon
30-12-2005, 16:34:45
Saludos

usuarioADOQuery1.SQL.Add('INSERT INTO usuarios VALUES(');
usuarioADOQuery1.SQL.Add('5,');
La sentencia es:
INSERT INTO usuario Values(5);

usuarioADOQuery1.SQL.Add('INSERT INTO usuarios
(nombre,apellido1,apellido2,login,password,rango,oficina) VALUES(');
usuarioADOQuery1.SQL.Add(QuotedStr(usuarioLabeledEdit1.Text));

La sentencia es:
INSERT INTO usuarios(nombre,apellido1,apellido2,login,password,rango,oficina) VALUES('textodellabel')

Moises22
09-01-2006, 01:09:27
En primer lugar disculpas, pero he estado casi una semana sin internet y por eso no he podido responder.Encuento al tema del problema, no lo he podido solucionar aun.

A ver puede que no me haya explicado bien en el problema. El problema es que cuando hago el insert de la segunda forma dice: "ERROR EN LA SINTAXIS SQL DE INSERT INTO",si os fijas la diferencia de la primera a la segunda es que omito el nombre del campo autonumerico y intento que lo autocree el Access, pero no, lanza un error.

El primer codigo que pongo funciona bien porque le paso ya el valor autonumerico (en este caso seria el 5). Pero yo quiero que ese valor lo coja automatico, y lo hago de la segunda forma, ya que asi me ha funcionado en otro form, pero da error en la sintaxis SQL, y no se de que puede ser...

Espero que alguien me pueda ayudar :(

Moises22
09-01-2006, 09:33:18
Aun sigo teniendo el mismo problema. ¿Alguien podria ayudarme o por lo menos orientarme? :(

vtdeleon
09-01-2006, 15:04:30
Saludos

Este problema, eeh, no estara resuelto alli ???

FOURIER
11-01-2006, 07:57:13
var
SEjecuta,comillas:String;
begin
comillas:='''';
Sejecuta:='INSERT INTO usuarios VALUES('+('5,')+comillas
usuarioLabeledEdit1.Text+comillas+','+comillas+
usuarioLabeledEdit2.Text+comillas+','+comillas
usuarioLabeledEdit3.Text+comillas+','+comillas
usuarioLabeledEdit4.Text+comillas+','+comillas+
usuarioLabeledEdit5.Text+comillas+','+
IntToStr(usuarioComboBox2.ItemIndex+1)+','+
IntToStr(oficinaux)+')';
usuarioADOQUER1.SQL.Text:=SEjecuta;
usuarioADOQuery1.ExecSQL;
end;


Eso te debe funcionar...
Cuando usas ADD recuerda que te lo pone un salto de línea no como el seguimiento de la Instrucción