Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Sqlite. No Puedo Añadir Una Nueva Tabla
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Sqlite. No Puedo Añadir Una Nueva Tabla 
 
Buenas!.

Estoy creando una nueva tabla, pero no tengo ni idea por que "aparentemente" no lo hace.
El archivo de la base de datos está creado, lo que hago es añadir una nueva tabla, pero cuando voy a ver si se ha actualizado
la base de datos con una tabla nueva, no ha cambiado. La fecha del archivo es la del día anterior.

Estoy seguro que si borro el archivo y ejecuto el ejemplo de gambas, se crean las dos tablas sin problemas.

Voy a mostrar como lo hago.

- Abro la conexión
- Creo una tabla
- Creo otra tabla
- Cierro la aplicación y voy a ver si ha cambiado la base de datos y no ha añadido la nueva tabla.

Comentario, no cierro la conexión...

Voy a añadir ahora un procedimiento que lo haga.
Pues tampoco, se queda igual.  

Y.."Estoy seguro que si borro el archivo y ejecuto el ejemplo de gambas, se crean las dos tablas sin problemas."

Voy a hacer una copia de la base antigua y le cambio el nombre.
Ejecuto el ejemplo.

Se ha creado la base de datos con las dos tablas.

- Borro la nueva base de datos y renombro la antigua al nombre original.
- Ejecuto el ejemplo.
- Igual, no se crea la tabla.

¿ Debo comprobar si existe el archivo de la base y borrarlo ?.  

Private conexion As Connection
Private basenombre As String = "poblacion.db"

Public Sub Form_Open()
  
  AbrirBase()
  CrearTablaPorRegion()
  CrearTablaPorPaises()
  CerrarConexion()
  
End

Public Sub AbrirBase()
  
  conexion = New Connection  
  conexion.Type = "sqlite3"
  conexion.Host = User.Home &/ "Recursos/Bases"
  conexion.Open
  
  If Not conexion.Databases.Exist(basenombre) Then
    conexion.Databases.Add(basenombre)
    Wait 0.3
    conexion.Close
    conexion.Name = basenombre
    conexion.Open
  Endif
  
End

Public Sub CrearTablaPorRegion()

  Dim datos As New Variant[][]
  Dim regpob As Variant[]
  
  'Doy por entendido que debería usar un entero como clave primaria,
  'y que tambien es posible usar más de una columna.
  
  datos = [
    ["Africa Central", 330993],
    ["Africa Austral", 743112],
    ["Africa del Norte", 1037463],
    ["Asia del Sur", 2051941],
    ["Asia del Pacifico", 785468],
    ["Oriente Medio", 687630],
    ["Asia Oriental", 1362955],
    ["Sur América", 5931221],
    ["Europa Oriental", 223427],
    ["Norte América", 661157],
    ["Europa Occidental", 387933],
    ["Japón", 100562]]
  
  conexion.Exec("DROP TABLE IF EXISTS PobPorRegion")
  ' De esta forma es como normalmente se suele ver operaciones con SQL
  conexion.Exec("CREATE TABLE PobPorRegion(" &
    "Region TEXT Not Null," &
    "Poblacion INTEGER Not Null," &
    "PRIMARY KEY(Region) )")
  
  For Each regpob In datos
    conexion.Exec("INSERT INTO PobPorRegion (Region, Poblacion) VALUES(&1, &2)", regpob[0], regpob[1])  
  Next
  
  conexion.Commit()
  
End

Public Sub CrearTablaPorPaises()

  Dim datos As New Variant[][]
  Dim regpaispob As Variant[]
  
  datos = [
  ["Asia Oriental", "RDP Corea", 24056],
  ["Asia Orietal", "Hong Kong (China)", 8764],
  ["Asia Oriental", "Mongolia", 3407],
  ["Asia Oriental", "Republica de Corea", 41491],
  ["Asia Oriental", "Taiwan", 1433],
  ["Norte América", "Bahamas", 368],
  ["Norte América", "Canada", 40876],
  ["Norte América", "Groenlandia", 43],
  ["Norte América", "Mexico", 126875],
  ["Norte América", "Estados Unidos", 493038]]
  
  conexion.Exec("DROP TABLE IF EXISTS PobPorPais")
  conexion.Exec("CREATE TABLE PobPorPais(" &
  "Region TEXT NOT NULL," &
  "Pais TEXT NOT NULL," &
  "Poblacion INTEGER NOT NULL," &
  "CONSTRAINT PaisLLave PRIMARY KEY(Region, Pais))")
  
  For Each regpaispob In datos
    conexion.Exec("INSERT INTO PobPorPais (Region, Pais, Poblacion) VALUES(&1, &2, &3)", regpaispob[0], regpaispob[1], regpaispob[2])
  Next
  conexion.Commit()
  
End

Public Sub CerrarConexion()
  
  If conexion = Null Then Return
  conexion.Close()
  conexion = Null
  
End
 



Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sqlite. No Puedo Añadir Una Nueva Tabla 
 
Sabía que el problema está en el modo en que abre la base de datos, o la conexión.

He añadido esto en el procedimiento Abrirbase y funciona. Lo mismo hay que eliminar algo más.

Public Sub AbrirBase()
  
  conexion = New Connection  
  conexion.Type = "sqlite3"
  conexion.Host = User.Home &/ "Recursos/Bases"
  conexion.Open
  
  If Not conexion.Databases.Exist(basenombre) Then
    conexion.Databases.Add(basenombre)
    Wait 0.3
    conexion.Close
    conexion.Name = basenombre
    conexion.Open
  Else
    conexion.Close
    conexion.Name = basenombre
    conexion.Open
  Endif
  
  
End
 


¿Tengo que hacer eso obligatoriamente  en caso de que exista conexión ?.  ¿ Cerrarla, darle nombre y abrirla ?.
Al existir la ruta y el archivo, Not hace que se salte todo el bloque de sentencias y no hacia nada.

P.d Cuando digo abrir la base, debería decir abrir conexión.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Sabado, 18 Junio 2016, 12:25; editado 2 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sqlite. No Puedo Añadir Una Nueva Tabla 
 
Por cierto , a veces en el contenido de los campos no estoy usando todas las tildes como debiese,
a pesar de mis lagunas mentales, es por si da algún problema.  

Fijo que en los nombres de los campos no se puede usar, ni con los nombres de las tablas.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Sabado, 18 Junio 2016, 12:30; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sqlite. No Puedo Añadir Una Nueva Tabla 
 
Sin probar tu código, dos cositas:

Citar:

If Not conexion.Databases.Exist(basenombre) Then
conexion.Databases.Add(basenombre)
Wait 0.3

El wait es necesario en la creación de bases SQLite porque es necesario darle al S.O. el tiempo para actualizar todos los cachés de disco y demás antes de intentar abrir la base de datos.

Por otra parte, lo que haces de crear la base si no existe, es poco ortodoxo. Es algo que he visto usar en algún ejemplo de gambas (creo que en el antiguo ejemplo de creación de una base de datos de imágenes) y está bien para ese ejemplo pero si vas a almacenar datos en esa base de datos.... mmmmm.... no. No es correcto.

Un archivo de disco puede estar sujeto a muchas cosas. Es una entidad "abierta" a cualquier manipulación externa a tu programa, copias, borrados, renombrados de carpetas, cambios de permisos, etc. etc. por eso si yo he estado almacenando datos diligentemente en mi base de datos y de repente un día abro mi programa y aparecen las tablas vacías ¡horror!. Peor aún, si abro mi programa y no me doy cuenta de que se han perdido datos porque voy derecho a mi pantalla de añadir y añado, añado, añado... ¡Más horror! Ahora tengo dos bases de datos, una que no sé dónde está y otra con el trabajo último.
Si al abrir la base de datos no existe, lo mínimo es un aviso al usuario por si quiere crearla, digo.

Saludos.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sqlite. No Puedo Añadir Una Nueva Tabla 
 
Shordi:

Citar:

Por otra parte, lo que haces de crear la base si no existe, es poco ortodoxo. Es algo que he visto usar en algún ejemplo de gambas (creo que en el antiguo ejemplo de creación de una base de datos de imágenes) y está bien para ese ejemplo pero si vas a almacenar datos en esa base de datos.... mmmmm.... no. No es correcto.


¿ Cómo me aconsejas que debería hacerlo ?.  

He creado un archivo de texto en el árbol del proyecto, donde voy apuntando estas anotaciones.
¿ Debería cerrar la base cada x tiempo ?.

Citar:

Si al abrir la base de datos no existe, lo mínimo es un aviso al usuario por si quiere crearla, digo.


Pero, ¿ solo por esto ?. Eso no es problema.

Actualmente solo lo hago para hacer ejercicios de base de datos. Pero en el futuro y creación de una base de datos, tendré que tener
en cuenta muchas cosas.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sqlite. No Puedo Añadir Una Nueva Tabla 
 
Citar:

¿ Cómo me aconsejas que debería hacerlo ?.

Guarda la configuración de la base en el Settings la primera vez, cuando la crees.
Luego búscala al abrir el programa y abre la base. Si no la encuentras avisa al usuario y dale opción de buscarla por el disco y de re-crearla.
Decida lo que decida, guarda la nueva configuración  en el settings... y vuelta a empezar.
   
Citar:
¿ Debería cerrar la base cada x tiempo ?.

No. no es necesario. Asegúrate, eso sí de efectuar commit cada vez que modifiques algo.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sqlite. No Puedo Añadir Una Nueva Tabla 
 
Shordi:

Gracias. Ahora otra cosa que tengo que aprender y que no uso casi nunca. el gb.settings.
Eeeh, que solo quería aprender a usar SQL.  

Ahora que recuerdo, tengo que crear otro post sobre lo ultimo que he estado viendo.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes No Puedo Añadir A La Base De Datos techm3 Bases de Datos 15 Jueves, 05 Agosto 2010, 03:03 Ver último mensaje
techm3
No hay nuevos mensajes Error Al Crear índices En Tabla Sqlite Marcelo Bases de Datos 2 Miercoles, 12 Octobre 2011, 04:46 Ver último mensaje
Marcelo
No hay nuevos mensajes Es Conveniente O No Usar Tildes En Nombres... v3ctor Bases de Datos 5 Lunes, 18 May 2015, 23:29 Ver último mensaje
Shell
No hay nuevos mensajes Insertar Un Registro En Sqlite En Una Tabl... tincho Bases de Datos 12 Sabado, 10 Septiembre 2016, 16:16 Ver último mensaje
tincho
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

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