Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Problema Al Insetar Un Nuevo Registro
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Problema Al Insetar Un Nuevo Registro 
 
Hola.
Estoy hacinedo una pequeña aplicación.
Trabajo con Sqlite3.
Me conecto a la base de la siguiente forma:
************************************
'CONEXION DE LA BASE DE DATOS
PRIVATE FUNCTION ConectarBase() AS Boolean
  
  IF hConn <> NULL THEN RETURN FALSE
  hConn = NEW Connection
  
  hConn.Host = "/home/manuel/Gambas/Registro"
  hConn.Name = "datos.db"
  hConn.Type = "sqlite3"
  
  TRY hConn.Open()
    IF ERROR THEN
      hConn = NULL
      Message.Error("Error al conectar la base de datos")
      RETURN FALSE
    END IF
    RETURN FALSE
END

**************************
La base se conecta bien y muestro los datos en la pantalla mediante un ColumView.

Para insertar los datos uso la siguiente instrucción:
****************************************
' Añadir un nuevo registro.
PUBLIC SUB BtnAceptar_Click()
TRY hconn.EXEC("insert into datos values (&1,&2,&3,&4,&5)", TxtUsuario.text, TxtNMatricula.Text, TxtSeccion.Text, TxtPlanta.Text, TxtObservaciones.Text)
  
 CATCH
    Message.Error("No se han podido guardar los datos")
END
*****************************
Los datos no se guardan.  Pero no sale el mensaje de error
Los campos en la tabla estan definidos como string.

¿alguna sugerencia?
Saludos.
 



 
Manuel - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Al Insetar Un Nuevo Registro 
 
Como no conozco sqlite es posible que ese insert que has puesto sea correcto aunque a mi no me lo parece. Sin embargo si estuviera mal te daría algún error de sqlite. Tu dices que no te dice nada ni se te va al catch ni nada así que lo que parece es que la instrucción se ejecuta correctamente pero que no inserta nada.

TRY hconn.EXEC("insert into datos values (&1,&2,&3,&4,&5)", TxtUsuario.text, TxtNMatricula.Text, TxtSeccion.Text, TxtPlanta.Text, TxtObservaciones.Text)


Creo que una alternativa es hacer el insert con gambas y pasar del lenguaje específico de sqlite.

Dim Rs as result
try Rs=hconn.create(datos)
Rs!campo1=txtusuario.text
Rs!campo2=txtnmatricula.text
Rs!campo3=txtseccion.text
...
Rs.update


Si utilizas estas técnicas el dia que te cambies de sqlite a mysql u otra solo tendrás que cambiar el type en la conexion, y los insert, select, update, delete funcionarán igual.
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Al Insetar Un Nuevo Registro 
 
Hola Manuel, bienvenido

Si mirar mucho el código, te recomiendo que quites el TRY y el CATCH del procedimiento del botón de añadir registro, para que el depurador de detenga en donde esté el error.
Una vez que se muestra el error, al menos te dará una pista de lo que ocurre, y al cerrar el mensaje mientras el programa está pausado,
podrás seleccionar variables y/o funciones para ver los datos que contienen en ese momento.

A mí me parece que cuando vas a hacer el INSERT, está queriendo introducir datos en la base de datos y no en una tabla de esa bd (al menos, tienen el mismo nombre), y al tener la instrucción TRY, no muestra el error.

Saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Al Insetar Un Nuevo Registro 
 
soplo escribió:  
Como no conozco sqlite es posible que ese insert que has puesto sea correcto aunque a mi no me lo parece.

Creo que una alternativa es hacer el insert con gambas y pasar del lenguaje específico de sqlite.

No hay nada específico de sqlite en esa sentencia, simplemente se nombran los parámetros como variables &1, &2... y a continuación se ponen los parámetros separados con comas. La ventaja es que no es necesario ninguna sintaxis adicional por ejemplo para fechas, cadenas o números.
Citar:

Si utilizas estas técnicas el dia que te cambies de sqlite a mysql u otra solo tendrás que cambiar el type en la conexion, y los insert, select, update, delete funcionarán igual.


Soplo, la sentencia es correcta, al menos en la forma -no sé si en el nombre de la tabla lo será.

El código que has puesto tú es válido, pero a mi gusto, menos funcional. Ambos son compatibles con los diferentes drivers de bd.
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Al Insetar Un Nuevo Registro 
 
creo que el error esta en que no abres la basa de datos para hacer el insert ito por ejemplo este es tu codigo
*******************
La base se conecta bien y muestro los datos en la pantalla mediante un ColumView.

Para insertar los datos uso la siguiente instrucción:
****************************************
' Añadir un nuevo registro.
PUBLIC SUB BtnAceptar_Click()
--------------AQUI ES DONDE TIENES QUE CONECTARLA PARA QUE LO RECONOZCA POR EJEMPLO EN TU CASO SERIA ASIN
  IF ConectarBase() THEN RETURN
------------------------------------------------- PRUEBA ESTO HABER SI TE SIRVE

TRY hconn.EXEC("insert into datos values (&1,&2,&3,&4,&5)", TxtUsuario.text, TxtNMatricula.Text, TxtSeccion.Text, TxtPlanta.Text, TxtObservaciones.Text)
  
 CATCH
    Message.Error("No se han podido guardar los datos")
END
 



 
david - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Al Insetar Un Nuevo Registro 
 
Citar:
El código que has puesto tú es válido, pero a mi gusto, menos funcional. Ambos son compatibles con los diferentes drivers de bd.

Pero ese método es mas transparente al no depender del lenguaje de base de datos. Si hace así los insert, updates, deletes y select el dia que quiera cambiar por ejemplo de sqlite a mysql bastará con cambiar el type y el usuario de la conexión y todo su código le seguirá funcionando.

Lo expliqué en el post del objeto connection y merece la pena. Es el método nativo de gambas y es eficiente.
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Al Insetar Un Nuevo Registro 
 
Manuel,
yo tambien cambiaria algo de la conexion a la base hazla publica para cuando programes se te se mas facil leer
tu la tienes asin
PRIVATE FUNCTION ConectarBase() AS Boolean
pon la sin que es mas facil para los programas reconocerlo
PUBLIC FUNCTION ConectarBase() AS Boolean
es un cosejo como siempre tu elijes
 



 
david - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Al Insetar Un Nuevo Registro 
 
Hola
Gracias a todos por la respuesta.
He encontrado una solución un poco chapucera, pero funciona.
El código queda de la siguiente forma:
**********************
' Añadir un nuevo registro.
PUBLIC SUB BtnAceptar_Click()
Dim P_Usuario,P_seccion,P_Observaciones as String
Dim P_Matricula, P_Planta as Integer

P_Usuario =TxtUsuario.text
P_Matricula = TxtNMatricula.Text
P_Seccion =TxtSeccion.Text
P_Planta =TxtPlanta.Text
P_Observaciones =TxtObservaciones.Text)

db.EXEC("insert into datos (Usuario, Matricula, Seccion, Planta, Observaciones)values (' "& TxtUsuario.text &" ', ' "& Matricula &" ', ' "& Seccion &" ', ' "& TxtPlanta  &" ', ' "& Observaciones &" ')")
  
END

****************************
Como veis hay que declarar una variable que va a contener el valor de TextBox , porque si pongo (por ejemplo)TxtUsuario.text, lo que se grabara es TxtUsuario.text y no el valor que contenga.
Saludos.
Manuel
 



 
Manuel - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Al Insetar Un Nuevo Registro 
 
Manuel escribió:  

PUBLIC SUB BtnAceptar_Click()
Dim P_Usuario,P_seccion,P_Observaciones as String
Dim P_Matricula, P_Planta as Integer

P_Usuario =TxtUsuario.text
P_Matricula = TxtNMatricula.Text
P_Seccion =TxtSeccion.Text
P_Planta =TxtPlanta.Text
P_Observaciones =TxtObservaciones.Text



A mi me parece que es lo mismo... para que lo entiendas, esas variables toman los valores de los textbox en el momento de pulsar el botón, es decir, que da igual que pongas en la sentencia sql las variables o el texto de los textbox porque son iguales en ese preciso momento. (A menos que no estés usando las mismas variables, porque ahora que me fijo, las variables no coinciden, unas empiezan con P_ y las que usas en el sql no)

Citar:
db.EXEC("insert into datos (Usuario, Matricula, Seccion, Planta, Observaciones)values (' "& TxtUsuario.text &" ', ' "& Matricula &" ', ' "& Seccion &" ', ' "& TxtPlanta  &" ', ' "& Observaciones &" ')")


Acabas de demostrar lo que digo, jeje. Si te fijas, el primer campo que insertas es el TxtUsuario.Text, no la variable que asignaste antes ¡y funciona!.
Es lógico, como también lo es usar la sintaxis inicial, con parámetros &1, &2... ahora que parece que ya tienes abierta la conexión antes del insert.

Otra cosa más: el motor sqlite3,  realmente no distingue entre los tipos de datos que almacena, aunque tu  digas si es entero, fecha o cadena; internamente los trata por afinidad, es decir, si tratas de almacenar un número en un campo de texto, lo convierte a texto, y si el campo está definido como integer, tratará de convertirlo y si no puede lo tratará como texto.

No obstante, te voy a mostrar el código que uso en mi programa de log que ya conoces, para que veas lo que digo con un insert mucho más complejo:

PRIVATE SUB logQSO()
    DIM sql AS String
    DIM modo AS String = cboModo.Text
    DIM dist AS Float = CFloat(Replace(lblDist.Text, ",", "."))
    IF modo = "LSB" OR modo = "USB" THEN modo = "SSB"
    
    IF connDB() THEN RETURN 'conecta a la bd
    sql = "INSERT INTO log VALUES (&1,&2,&3,&4,&5,&6,&7,&8,&9,&10,&11,&12,&13,&14,&15,&16,&17,&18," &
              "&19,&20,&21,&22,&23,&24,&25,&26,&27,&28,&29,&30,&31,&32,&33,&34,&35,&36,&37,&38);"
    
    dbLog.cnLog.Exec(sql, "", vFecha.Value, vHora.Text, vHora2.Text, txtCall.Text, parseFreq(txtFreq.Text),
                    parseFreq(txtFreq2.Text), cboBanda.Text, modo, cboPropa.Text, txtRSTr.Text,
                    txtRSTe.Text, txtNameQSO.Text, txtLocQSO.Text, txtQTHqso.Text, txtComment.Text, QSLsent(),
                    QSLrec(), dteQSLe.Value, dteQSLr.Value, txtMgrQSO.Text, c.pfx, c.continent, c.cqz, c.ituz,
                    txtState.Text, txtCounty.Text, txtIOTA.Text, ini["Estacion/QRZ"], txtPwr.Text, ini["Estacion/Locator"],
                    txtSatName.Text, txtSatMode.Text, lblEmail.Text, c.entity, c.number, txtTPEA.Text, dist)            
    fillData()
    
    CATCH    
        Message.Error(("Error loging QSO\n") & Error.Text & "\n" & Error.Where)    
END


Por cierto, para los que no lo sepan, aquí se ve la forma de romper las líneas largas para mejor presentación del código:
Las sentencias que contienen comas se pueden continuar en otra línea a partir de una coma, y para hacerlo con cadenas,
basta cerrar la cadena con las dobles comillas y un ampersand & y continuar la línea abriendo las comillas (teniendo en
cuenta los espacios).

Espero que sirva de ayuda, saludos
 




===================
Jesús Guardón

Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".

"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Al Insetar Un Nuevo Registro 
 
cierto es lo mismo, yo no lo tengo declarado y a mi se me entra los registros
 



 
david - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Problema Al Seleccionar Un Registro De La ... Cubel Bases de Datos 5 Martes, 19 Enero 2010, 22:13 Ver último mensaje
Cubel
No hay nuevos mensajes Soy Nuevo ;D Pequeño Problema Santi_Phoenix Controles/Librerías/Componentes 2 Lunes, 10 Junio 2013, 23:55 Ver último mensaje
Santi_Phoenix
No hay nuevos mensajes Creación De Un Nuevo Control En Gambas3: ... jsbsan Videotutoriales 3 Viernes, 06 Febrero 2015, 12:44 Ver último mensaje
jsbsan
No hay nuevos mensajes Gambas 3.9. Problema En El Arbol De Direct... Shell General 1 Lunes, 05 Septiembre 2016, 00:23 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron