Borrar Un Registro


Ir a la página 1, 2  Siguiente

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

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



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
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


Perfil MP  
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?

  • 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?

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

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

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

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

última edición por fabianfv el Jueves, 03 Diciembre 2009, 16:43; editado 1 vez
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.1186s (PHP: -18% SQL: 118%)
Consultas SQL: 25 - Debug off - GZIP Activado