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