Sqlite. No Puedo Añadir Una Nueva Tabla


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

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

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

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

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


Página 1 de 1


  
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.4504s (PHP: -58% SQL: 158%)
Consultas SQL: 47 - Debug off - GZIP Activado