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.
Borrar Un Registro
Objetivo: Re: Borrar Un Registro
Me parece que no comprendes el código que has puesto:
Citar:
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
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
Objetivo: 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
Hacer esto
Eso borra de la tabla editorial los registros cuyo nombre sea igual a respuesta sea cual sea la base de datos.
La clase connection
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
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
Objetivo: 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?
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.
Objetivo: 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?
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?
Objetivo: Re: Borrar Un Registro
Si te tiras a escribir tú la sentencia, procura ser cuidadoso:
No contiene las comillas necesarias para indicar que Plaza es un literal
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.
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.
Objetivo: Re: Borrar Un Registro
O también usando comita simple
o si es una variable
"Delete * from Editorial where Nombre = 'Plaza'"
o si es una variable
"Delete * from Editorial where Nombre = '" & variable & "'"
Objetivo: Re: Borrar Un Registro
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?
Idem anterior
Error 1
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").
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\")
Citar:
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:
Idem anterior
Citar:
Error 1
Citar:
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:
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\")
Objetivo: Re: Borrar Un Registro
última edición por soplo el Jueves, 03 Diciembre 2009, 15:58; editado 1 vez
No había visto el problema al borrar.
Esto es lo que pusiste
Y eso no se en SQLITE pero en MYSQL está mal. En Mysql sería así:
comprueba que ese enunciado se ajuste al sql de sqllite (que yo no conozco)
La otra forma correcta sería:
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
Esto es lo que pusiste
Y eso no se en SQLITE pero en MYSQL está mal. En Mysql sería así:
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
Objetivo: Re: Borrar Un Registro
última edición por fabianfv el Jueves, 03 Diciembre 2009, 16:43; editado 1 vez
Soplo, una aclaración:
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.
Citar:
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.
última edición por fabianfv el Jueves, 03 Diciembre 2009, 16:43; editado 1 vez
Página 1 de 2
No puede crear mensajesNo 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.1186s (PHP: -18% SQL: 118%)
Consultas SQL: 25 - Debug off - GZIP Activado