Autor |
Mensaje |
numero110
Usuario
Registrado: Diciembre 2009
Mensajes: 2
Edad: 64
|
Borrar Un Registro
Hola.
Estoy trabajando con SQLITE3.
Me conecto a la base de datos mediante.
***********************************
'Funcion conectar la base de datos.
PRIVATE FUNCTION ConectarBase() AS Boolean
IF hConn <> NULL THEN RETURN FALSE
hConn = NEW Connection
hConn.Host = "/home/manuel/Gambas/Libros"
hConn.Name = "Datos"
hConn.Type = "sqlite3"
TRY hConn.Open()
IF ERROR THEN
hConn = NULL
Message.Error("Error al conectar con la base de datos")
RETURN FALSE
END IF
RETURN FALSE
END
*********************************
Para borrar un registro he puesto el código:
********************************************************
PUBLIC SUB Btn_Borrar_Click()
DIM pregunta AS Integer
DIM respuesta AS String
respuesta = hResul["Nombre"]
pregunta = message.Warning("¿Esta seguro de eliminar el registro?", "Si", "No")
IF pregunta = 1 THEN
TRY hConn.Exec("DELETE from Editorial where Nombre = respuesta"
TRY hResul.Update
message.Info("El registro ha sido eliminado")
ME.Close
END IF
END
***************************************
El fallo esta en la sentencia: TRY hConn.Exec("DELETE from Editorial where Nombre = respuesta"
Ya que sale en mensaje informado que el registro ha sido eliminado, pero el registro no se elimina.
¿Alguna ayuda?
Saludos.
|
#1 Martes, 01 Diciembre 2009, 12:38 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Borrar Un Registro
Citar:
El fallo esta en la sentencia: TRY hConn.Exec("DELETE from Editorial where Nombre = respuesta"
Ya que sale en mensaje informado que el registro ha sido eliminado, pero el registro no se elimina.
Me parece que no comprendes el código que has puesto:
'La instrucción siguiente ni siquiera compilaría, falta el paréntesis de cierre:
TRY hConn.Exec("DELETE from Editorial where Nombre = respuesta"
'Luego de usar TRY, deberías chequear si se produce un error
TRY hResul.Update
'El mensaje de que el registro se elimina lo has puesto tú de modo que aparezca aún cuando el borrado falle:
message.Info("El registro ha sido eliminado")
ME.Close '¿Por qué querrías esta instrucción aquí?
'. . .
'Prueba con esto:
TRY hConn.Exec("DELETE from Editorial where Nombre='" & respuesta & "'")
IF Error THEN
'Hago algo para lidiar con el error aunque más no sea un mensaje al usuario:
Message.Error(Error.Text)
ELSE
Message.Info("El registro ha sido eliminado")
hResul.Update
ENDIF
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#2 Martes, 01 Diciembre 2009, 15:35 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Borrar Un Registro
Utilizar exec supone enviar una sentencia sql al motor de base de datos y puede hacer un código dependiente de una base de datos determinada. Puede haber diferentes sql para diferntes bases de datos (de hecho los hay).
Además del método de fabian, gambas aporta otra forma que es común para cualquier base de datos.
En vez de hacer esto
TRY hConn.Exec("DELETE from Editorial where Nombre='" & respuesta & "'")
Hacer esto
try hConn.delete("Editorial","Nombre=&1",respuesta)
Eso borra de la tabla editorial los registros cuyo nombre sea igual a respuesta sea cual sea la base de datos.
La clase connection
|
#3 Martes, 01 Diciembre 2009, 16:19 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Borrar Un Registro
Adhiero a lo que menciona Soplo. Para que el código SQL no sea dependiente de un DBMS en particular, debe escribirse el código siguiendo los estándares ¿pero cuál de los estándares? Existen diferentes versiones del estándar ISO: SQL86, SQL89, SQL92, SQL03, etc. (también conocidos como SQL1 -86, SQL2 -92-...) y se debe observar qué estándares soporta el DBMS que se vaya a usar. Además el soporte a un estándar en particular por parte del DBMS puede ser incompleto.
Pero este es un problema de portabilidad que generalmente se soluciona escribiendo el código SQL según el estándar más antiguo (en realidad, hoy en día debería escribirse para el estándar SQL2 -SQL92-). Si el DBMS que se usa no soporta SQL estándar es mejor no usarlo.
Ahora bien, si no se necesita escribir código SQL portable, es decir si analizamos que nunca será necesario reemplazar el DBMS actual por otro, se puede usar el dialecto SQL específico del DBMS en uso.
¿Qué aporta entonces gambas con su modelo de objetos de acceso a datos?
- No es necesario conocer diferentes estándares SQL.
- No es necesario conocer los dialectos SQL que maneja cada DBMS.
- Facilita la portabilidad.
- En la situación en que se necesite resguardar la posibilidad de migrar a otro DBMS, y el DBMS en uso no brinde soporte de SQL estándar o provea un soporte muy pobre, el manejo que propone gambas a través de los objetos de su componente gb.db brindan una solución que sería muy laborioso lograr de otro modo.
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#4 Martes, 01 Diciembre 2009, 17:40 |
|
|
numero110
Usuario
Registrado: Diciembre 2009
Mensajes: 2
Edad: 64
|
Re: Borrar Un Registro
Hola.
He probado con las siguientes sentencias para borrar el registro.
TRY hConn.delete("Editorial", "Nombre=&1", respuesta)
TRY hConn.Exec("DELETE from Editorial where Nombre='" & respuesta & "'")
TRY hConn.Exec("Delete * from Editorial where Nombre = &1", respuesta)
TRY hConn.Exec("Delete * from Editorial where Nombre = &1", Table.Current.key)
El error que me indica es: Null Object"
Con el gestor de base de datos he intentado borra un registro y cuando estoy escribiendo la orden, ya sale el mensaje "no es posible ejecuatar la orden.
Lo que escribo es
Delete * from Editorial where Nombre = Plaza
Plaza es el nombre de una editorial que he grabado en la base de datos.
¿alguna ayuda?
|
#5 Jueves, 03 Diciembre 2009, 09:46 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Borrar Un Registro
Si te tiras a escribir tú la sentencia, procura ser cuidadoso:
Delete * from Editorial where Nombre = Plaza
No contiene las comillas necesarias para indicar que Plaza es un literal
"Delete * from Editorial where Nombre = \"Plaza\""
Es una cadena válida para enviar. Debes "escapar" las comillas dobles cuando van dentro de otra cadena.
De todas formas ayudaría a ayudarte si mandas el código completo de la función que has escrito y la definición de la tabla.
Algo estás haciendo mal, que sqlite es algo muy probado y el motor de gambas también. Funcionan. Seguro.
=================== No podemos regresar
|
#6 Jueves, 03 Diciembre 2009, 09:56 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Borrar Un Registro
O también usando comita simple
"Delete * from Editorial where Nombre = 'Plaza'"
o si es una variable
"Delete * from Editorial where Nombre = '" & variable & "'"
|
#7 Jueves, 03 Diciembre 2009, 15:08 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Borrar Un Registro
Citar:
TRY hConn.delete("Editorial", "Nombre=&1", respuesta)
Esta sentencia parece correcta ¿qué error te dio? Puede que el valor proporcionado por la variable respuesta no figurara en el campo Nombre de la tabla Editorial. También es posible que el dato se haya borrado de la tabla Editorial pero no se actualizara tu programa. ¿Estas respetando las mayúsculas y minúsculas en los nombres de tablas y campos? ¿La conexión está establecida?
Citar:
TRY hConn.Exec("DELETE from Editorial where Nombre='" & respuesta & "'")
Idem anterior
Citar:
TRY hConn.Exec("Delete * from Editorial where Nombre = &1", respuesta)
Error 1
Citar:
TRY hConn.Exec("Delete * from Editorial where Nombre = &1", Table.Current.key)
Error 1
Error 2: Parece que no existe en tu programa un control (como ColumnView con los datos de tu tabla cargados) llamado Table (de ahí el error "Null Object").
Citar:
Con el gestor de base de datos he intentado borra un registro y cuando estoy escribiendo la orden, ya sale el mensaje "no es posible ejecuatar la orden.
Lo que escribo es
Delete * from Editorial where Nombre = Plaza
Errores:
1- La sentencia Delete no soporta el uso del asterisco
2- Los valores de tipo cadena llevan comillas: puedes usar comillas simples 'plaza' o dobles "plaza" (si incluyes este valor literal en un string de gambas tienes que "escapar las comillas" como indicó Shordi \"plaza\")
=================== Cómo programar con Gambas
Speed Books: informática libre.
|
#8 Jueves, 03 Diciembre 2009, 15:27 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Borrar Un Registro
No había visto el problema al borrar.
Esto es lo que pusiste
TRY hConn.Exec("DELETE from Editorial where Nombre='" & respuesta & "'")
Y eso no se en SQLITE pero en MYSQL está mal. En Mysql sería así:
TRY hConn.Exec("DELETE Editorial where Nombre='" & respuesta & "'")
comprueba que ese enunciado se ajuste al sql de sqllite (que yo no conozco)
La otra forma correcta sería:
TRY hConn.delete("Editorial", "Nombre=&1", respuesta)
Eso debería funcionar sin cambiar nada tanto en sqlite como en mysql. Si no te funciona puede ser poque la tabla editorial no tiene una clave primaria o bien porque la variable respuesta no tiene un valor válido o bien porque hConn no está abierta.
Un saludo
última edición por soplo el Jueves, 03 Diciembre 2009, 15:58; editado 1 vez
|
#9 Jueves, 03 Diciembre 2009, 15:57 |
|
|
fabianfv
Analista Programador
Registrado: Octobre 2009
Mensajes: 495
Edad: 50 Ubicación:
|
Re: Borrar Un Registro
Soplo, una aclaración:
Citar:
Y eso no se en SQLITE pero en MYSQL está mal. En Mysql sería así:
TRY hConn.Exec("DELETE Editorial where Nombre='" & respuesta & "'")
comprueba que ese enunciado se ajuste al sql de sqllite (que yo no conozco)
la cláusula from de la sentencia delete es válida (forma parte del estándar ANSI SQL) y MySQL la soporta correctamente (y también SQLite) y es obligatoria.
=================== Cómo programar con Gambas
Speed Books: informática libre.
última edición por fabianfv el Jueves, 03 Diciembre 2009, 16:43; editado 1 vez
|
#10 Jueves, 03 Diciembre 2009, 16:31 |
|
|
|