Problema Al Insetar Un Nuevo Registro


Ir a la página 1, 2  Siguiente

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

Perfil MP  
Objetivo: 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.

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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.

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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.

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: Re: Problema Al Insetar Un Nuevo Registro
cierto es lo mismo, yo no lo tengo declarado y a mi se me entra los registros

Perfil MP  
Ir a la página 1, 2  Siguiente

Página 1 de 2


  
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

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.1534s (PHP: -13% SQL: 113%)
Consultas SQL: 23 - Debug off - GZIP Activado