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)
-   -   Insertar datos con dbGo (https://www.clubdelphi.com/foros/showthread.php?t=66686)

mcsebas 08-03-2010 03:15:06

Insertar datos con dbGo
 
Holas a todos estoy con el siguiente problema resulta que estoy intentando insertar un registro en una BD en Access con los componentes dbGo, la conexión y la query en si. Conecta bien pero a la hora de querer insertar me da que hay un error en la sintaxis de la instrucción SQL.

Los campos 'idus' se auto incrementa y el campo 'activo' es del tipo bool.
Código Delphi [-]
with cmdAgregar do
     begin
          Open;
          SQL.Clear;
          SQL.Text:='insert into Usuarios (idus,user,pass,nombre,activo) values (NULL,'+
                     QuotedStr(txtUsuario.Text)+','+QuotedStr(txtClave.Text)+','+
                     QuotedStr(txtNombre.Text)+',1)';
          ExecSQL;
          Close;
     end;

La verdad que no se que pasa pero que puede ser el hecho de que el valor sea Null en el primer campo que se yo.

Gracias. :)

Neftali [Germán.Estévez] 08-03-2010 11:03:13

Si el campo es autoincremental, prueba a no ponerlo en la consulta, ni el nombre ni el NULL, simplemente no lo añadas a la lista.

mcsebas 08-03-2010 15:59:24

Intente lo que me dijiste y me sigue dando el error:

Cita:

Error de Sintaxis en la instrucción 'INSERT INTO'
Te comento que utilizo un ADOQuery para insertar datos o debería utilizar un ADOCommand.

Gracias. :)

Neftali [Germán.Estévez] 08-03-2010 16:15:55

Yo he usado de siempre un ADOQuery para las inserciones y nunca he tenido problemas. No creo que ahora haya cambiado nada.

¿Puedes poner la SQL de la estructura de la tabla?

Otra cosa, haz una prueba con una SQl directa, a ver si falla.

Código SQL [-]
insert into Usuarios (user,pass,nombre,activo) values 
('pepe','contra','Pepe Gómez',1)

o
insert into Usuarios (user,pass,nombre,activo) values 
('pepe','contra','Pepe Gómez',True)

Colocala en la propiedad SQL del ADOQuery directamente y ejecuta desde código el ADOQuery1.ExecSQL a ver que te dice.

mcsebas 08-03-2010 18:58:47

La estructura de la tabla en cuestion es:

------------------------------------
Tabla Usuarios
------------------------------------
1 | idus | Autonumérico
2 | user | Texto de 20 caracteres
3 | pass | Texto de 8 caracteres
4 | nombre | Texto de 32 caracteres
5 | activo | Si/No (o sea booleano)
------------------------------------

Te cuento algo que me olvide es que no trabajo con los dataset porque como es solo para dar de alta a usuarios no me parecía que vaya a ser necesario.

Gracias. :)


Neftali [Germán.Estévez] 09-03-2010 12:05:22

Cita:

Empezado por mcsebas (Mensaje 356047)

Te cuento algo que me olvide es que no trabajo con los dataset porque como es solo para dar de alta a usuarios no me parecía que vaya a ser necesario.

No es necesario. A priori con el ADOQuery y el ADOConnection debería bastar. Incluso si configuras la conexión en el ADOQuery te puedes ahorrar el ADOConnection. No necesitas más componentes para la inserción.

¿Has probado lo de colocar la SQL en el query y realizar el INSERT?
¿Funciona? Te da algun error? ¿Cual?

mcsebas 09-03-2010 23:09:04

Hermano eh intentado todo lo que me dijiste y hasta ahora ningun resultado me sigue dando error en la sintaxis pero no se que puede ser.

Te paso la cadena parametrizada que utilizo y decime si hay algun error.

Código SQL [-]
 
insert into Usuarios (idus,user,pass,nombre,activo) values (null,:User,:Pass,:Nom,True)

La verdad que sigue con los problemas si persisten todavía probaré con Zeos o algun driver nativo tipo dbExpress.

Gracias. :)

Neftali [Germán.Estévez] 10-03-2010 11:37:19

Otra cosa, ahora me acabo de dar cuenta de que el Open del principio sobra.

Neftali [Germán.Estévez] 10-03-2010 12:28:52

Tonto, tonto, tonto, tonto (de mi)...

Al final he realizado una pequeña prueba y efectívamente tienes razón. Da error de INSERT INTO... en una sentencia sencilla que no tiene problemas...

Después de andar dándole vueltas un rato (porque habré hecho esto cientos de veces) me ha venido a la cabeza un error que me pasó hace bastante tiempo... (y al que estuve un rato dándole vueltas como a este... :o:o:o)

Haz una prueba:

Cambia el nombre campo user por user1 y vuelve a realizar las pruebas que hemos comentado.

:D:D:D

Ya me dirás...

mcsebas 10-03-2010 23:47:23

Camarada la cosa ha mejorado yo tambien habia pensado en este caso pero ahora me sale con otro mensaje de error que es el siguiente:

Cita:

Ha intentado asignar el valor Null a una variable que no es un tipo de datos Variant
Es referido al campo indice que es autonumérico según el diseño de la tabla o sea que se auto incrementa.

Gracias. :)

Neftali [Germán.Estévez] 11-03-2010 10:08:51

En ese caso, ya te comenté que no debes añadir ese campo a la consulta SQL; Ni el nombre ni el valor, puesto que es un autonumérico que se incrementa sólo.

Código Delphi [-]
  insert into Usuarios (user,pass,nombre,activo) values (:User,:Pass,:Nom,True)

Porque intentar añadir un valor (aunque sea NULL) dará error, puesto que no es un campo que debas añadir tú.

mcsebas 12-03-2010 00:26:30

Camarada ahora si funciona por fin. Sólo una unica pregunta como hago para ponerle seguridad a la base de datos.

Porque veo que en la cadena de conexion me permite poner un password.

Gracias. :)

Neftali [Germán.Estévez] 12-03-2010 12:27:19

Prueba a colocar la contraseña desde el Access y en la cadena de conexón deberás añadir la misma para poder conectar.

mcsebas 15-03-2010 16:00:53

Efectivamente tenías razon gracias man por todo.

Buena Ondaaaaaaaa !!! :)

mcsebas 16-03-2010 19:17:10

Compañero ahora tengo un problema con el dataset y dbgrid. Resulta que puse un compenente ADOConnection, ADODataSet y DataSource y en una libreria hago la activación del usuario, hasta ahi todo bien pero cuendo hago

Código Delphi [-]
 
ADODataSet.Refresh

Los datos en el DBGrid no se ha actualizado o sea que no me figura el nuevo usuario activado. Reinicio el programa y si me aparece.

Caro 17-03-2010 14:19:20

Hola mcsebas, utiliza esto para actualizar tu consulta:

Código Delphi [-]
 //Esto
 ADODataSet.Close;
 ADODataSet.Open;
 //o
 ADODataSet.Active := False;
 ADODataSet.Active := True;

Saluditos


La franja horaria es GMT +2. Ahora son las 04:28:38.

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