Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

Sqlite. No Puedo Añadir Una Nueva Tabla

Sqlite. No Puedo Añadir Una Nueva Tabla
Artículo
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



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Sabado, 18 Junio 2016, 10:09 ]
 


Sqlite. No Puedo Añadir Una Nueva Tabla
Comentarios
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



 
última edición por Shell el Sabado, 18 Junio 2016, 12:25; editado 2 veces 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Sabado, 18 Junio 2016, 12:23 ]
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



 
última edición por Shell el Sabado, 18 Junio 2016, 12:30; editado 1 vez 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Sabado, 18 Junio 2016, 12:30 ]
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.



 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Lunes, 20 Junio 2016, 08:48 ]
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



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Lunes, 20 Junio 2016, 10:13 ]
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.



 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Lunes, 20 Junio 2016, 10:32 ]
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



 
Shell - Ver perfil del usuario Enviar mensaje privado  
Shell [ Lunes, 20 Junio 2016, 11:26 ]
Mostrar mensajes anteriores:    
 
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


 



 

cron