Crear Base De Datos SQLITE Por Codigo


Objetivo: Crear Base De Datos SQLITE Por Codigo
Se que en mysql es posible crear una base datos directamente desde codigo, con gambas. ¿es posible hacerlo tambien para sqlite3? necesito crear una bbdd (archivo sqlite) cuando el usuario pulse un determinado boton.

Perfil MP  
Objetivo: Re: Crear Base De Datos SQLITE Por Codigo
El procedimiento para crear bases de datos no depende del motor de la base de datos. gambas tiene unos procedimientos propios para crear bases de datos, tablas, campos e índices. En la versión que yo manejo no puede hacer triggers ni constrains pero lo demás si.

Así que entiendo que si gambas soporta sqlite 3 pues podrás crearla como cualquier otra.
La clase connection

En cualquier caso siempre podrías hacer un exec y que lo creara el motor de base de datos.


Perfil MP  
Objetivo: Re: Crear Base De Datos SQLITE Por Codigo
Prueba esto:
public sub creabasesqlite()
DIM hcon AS NEW Connection
DIM laTabla AS Table
DIM dbName AS String

DBName = "mibase"
' Abre la conexion sólo al servidor de datos, sin abrir tablas
hcon.Type = "sqlite3"
hcon.Host = User.Home
hcon.Name = ""
hcon.Login = ""
hcon.Password = ""
hcon.Port = ""

TRY hcon.Open()

' Comprueba si existe la base de datos /user/home/importada_csv, y si no existe la crea
IF NOT hcon.Databases.Exist(DBName) THEN
hcon.Databases.Add(DBName)
' Esta espera es necesaria con bases SQLite , aunque no con Mysql
WAIT 0.5
END IF
' Se cierra la conexión al servidor
hcon.Close()
' Se abre la conexión a la base de datos
hcon.Host = User.Home
hcon.Name = DBName
TRY hcon.Open()
IF ERROR THEN
Message.Error("No se pudo abrir la base de datos")
RETURN FALSE
END IF
latabla = hcon.Tables.Add("nueva_tabla") 'creamos una tabla
latabla.Fields.Add("ih_indice", db.Serial) ' Añadimos una clave primaria autoincremental
latabla.Fields.Add("un_campo",db.string) ' Añadimos los campos que necesitemos
latabla.PrimaryKey = ["ih_indice"]
latabla.Update()

hcon.Close
CATCH
Message.Error(Error.Text)
RETURN FALSE
END

Perfil MP  
Objetivo: Re: Crear Base De Datos SQLITE Por Codigo
Detroyer:

Sí que es posible escribir un script sql para trabajar con SQLite.

Te aconsejo que escribas el script en un editor que resalte la sintaxis SQL y lo lances desde el editor de BD de gambas, para probar que funciona. Así luego puedes colocar ese código sql en una variable string (ya sea copiando y pegando, o leyéndolo de un archivo) y lanzar su ejecución desde gambas.


PUBLIC SUB Button1_Click()
DIM sql AS String

MiConexionSQLite.Databases.Add('Alexandria')
sql = "CREATE TABLE 'Autores' ( 'idAutor' INT4 NOT NULL , 'NombresAutor' TEXT, 'ApellidosAutor' TEXT, PRIMARY KEY (idAutor) );"
MiConexionSQLite.Exec(sql)

END



Verifica la sintaxis: Sintaxis SQLite, ya que no se ajusta exactamente a los estándares.

No obstante, usar las clases de gb.db para hacer esto es una mejor idea.

última edición por fabianfv el Jueves, 03 Diciembre 2009, 17:19; editado 1 vez
Objetivo: Re: Crear Base De Datos SQLITE Por Codigo
Supongo que tarde, pero me gustaria aportar un diseño de BD de pruebas que empleo para dar juego a alguna aventura que me propongo con el lenguaje y no se si va a funcionar.
Tengo un modulo que crea la base de datos y desde la funcion que la crea, llama a los creadores de las tablas - Asi:

' gambas module file
PUBLIC hCon AS Connection 'Conexion que usaremos en toda la aplicacion
CONST sDBname AS String = "mybooks.db" 'Todos los usuarios leeran en su Home
'la base de datos mybooks.db (sqlite3)
PUBLIC SUB openDB()
'hCon.Close 'Podemos intentar cerrar la conexion si hay alguna activa y no dara error
hCon = NEW Connection 'Instanciamos conexion
WITH hCon
.Type = "sqlite3"
.Host = User.Home 'En el directorio Home (para todos los usuarios)
.Name = ""
END WITH
hCon.Open
IF NOT mData.hCon.Databases.Exist("mybooks.db") THEN 'Si no existe la B.D. la creamos
hCon.Databases.Add("mybooks.db")
WAIT 0.3 'Esperamos para dar tiempo a que sea creada si hay algun lapso
hCon.Close
hCon.Name = "mybooks.db"
hCon.Open
' Como la hemos creado nueva, creamos las tablas
newlibro
newautor
newcoleccion
newgenero
neweditorial
ENDIF
mData.hCon.Close
mData.hCon.Name = sDBname
mData.hCon.Open

END

PUBLIC FUNCTION newlibro() AS Boolean
' Tabla de la ficha de registro de libros

DIM hTable AS Table

IF NOT hCon.Tables.Exist("libro") THEN
hTable = hCon.Tables.Add("libro")
WITH hTable.Fields
.Add("idlib", db.Serial) ' Identificador - Id
.Add("titlib", db.String, 40) ' Titulo
.Add("sublib", db.String, 40) ' Subtitulo
.Add("autlib", db.Integer,, 1) ' R -> Autor
.Add("collib", db.Integer,, 1) ' R -> Coleccion
.Add("edilib", db.Integer,, 1) ' R -> Editorial
.Add("genlib", db.Integer,, 1) ' R -> Genero
.Add("paglib", db.Integer) ' Numero de paginas
.Add("siplib", db.String) ' Sipnosis argumental
.Add("isbnlib", db.String, 14) ' ISBN - Numero de identificacion
.Add("stdlib", db.Boolean,, TRUE)
END WITH
hTable.PrimaryKey = ["idlib"]
hTable.Update
ENDIF
END

PRIVATE FUNCTION newcoleccion() AS Boolean
' Agrupación de libros en colecciones
' Si no pertenece a ninguna coleccion sera la 1 - INDEPENDIENTE

DIM hTable AS Table
DIM rsTable AS Result
IF NOT hCon.Tables.Exist("coleccion") THEN
hTable = hCon.Tables.Add("coleccion")
WITH hTable.Fields
.Add("idcol", db.Serial)
.Add("nomcol", db.String, 30)
END WITH
hTable.PrimaryKey = ["idcol"]
hTable.Update
ENDIF
rsTable = hCon.Create("coleccion") 'Creamos registro
rsTable!nomcol = "INDEPENDIENTE" 'Dato que tomara el campo
rsTable.Update 'Hacemos efectivos los cambios (grabamos)

END

PRIVATE FUNCTION newgenero() AS Boolean
' Categoria de libros por su genero
' Si no conocemos el genero sera el 1 - INDEFINIDO

DIM hTable AS Table
DIM rsTable AS Result
IF NOT hCon.Tables.Exist("genero") THEN
hTable = hCon.Tables.Add("genero")
WITH hTable.Fields
.Add("idgen", db.Serial)
.Add("nomgen", db.String, 30)
END WITH
hTable.PrimaryKey = ["idgen"]
hTable.Update
ENDIF
rsTable = hCon.Create("genero") 'Creamos registro
rsTable!nomgen = "INDEFINIDO" 'Dato que tomara el campo
rsTable.Update 'Hacemos efectivos los cambios (grabamos)

END
PUBLIC FUNCTION neweditorial() AS Boolean
' Tabla de datos de la editorial

DIM hTable AS Table

IF NOT hCon.Tables.Exist("editorial") THEN
hTable = hCon.Tables.Add("editorial")
WITH hTable.Fields
.Add("idedi", db.Serial)
.Add("nomedi", db.String, 40)
.Add("diredi", db.String, 40)
.Add("disedi", db.String, 5)
.Add("pobedi", db.String, 20)
.Add("prvedi", db.String, 20)
.Add("tlfedi", db.String, 9)
.Add("webedi", db.String, 40) 'Direccion web
.Add("maiedi", db.String, 40) 'Correo electronico
END WITH
hTable.PrimaryKey = ["idedi"]
hTable.Update
ENDIF
END

PUBLIC FUNCTION newautor() AS Boolean
' Tabla de datos de autor

DIM hTable AS Table

IF NOT hCon.Tables.Exist("autor") THEN
hTable = hCon.Tables.Add("autor")
WITH hTable.Fields
.Add("idaut", db.Serial)
.Add("nomaut", db.String, 40)
.Add("obsaut", db.String)
END WITH
hTable.PrimaryKey = ["idaut"]
hTable.Update
ENDIF
END


Solo es un ejemplo, pero completo y espero que le ayude a alguien.
Un abrazo

Perfil MP  
Objetivo: Re: Crear Base De Datos SQLITE Por Codigo
Shordi:

Cuando hiciste este código debió ser una función, ¿ verdad ?.
Es que como veo que devuelve boolean pero es un procedimiento que no devuelve ningún valor.

..las prisas.

Seguiremos viendo el ejemplo, para crear un resumen que me ayude a crear la base de esta forma.

El ejemplo de Ahtonio no esta nada mal.
(Sobra el prefijo mdata que luego no se encuentra. Es solo Hcon )

P.d, cuesta a veces encontrar estas cosas por la comunidad..
Ayer la encontré y hoy no encontraba la manera, me acorde del usuario Ahtonio y busque sus mensajes.

Saludos

última edición por Shell el Sabado, 11 May 2013, 12:06; editado 1 vez
Objetivo: Re: Crear Base De Datos SQLITE Por Codigo
En este fragmento de código veo por primera vez esto:


Public Function newlibro() As Boolean
' Tabla de la ficha de registro de libros

Dim hTable As Table

If Not hCon.Tables.Exist("libro") Then
hTable = hCon.Tables.Add("libro")
With hTable.Fields
.Add("idlib", db.Serial) ' Identificador - Id
.Add("titlib", db.String, 40) ' Titulo
.Add("sublib", db.String, 40) ' Subtitulo
.Add("autlib", db.Integer,, 1) ' R -> Autor
.Add("collib", db.Integer,, 1) ' R -> Coleccion
.Add("edilib", db.Integer,, 1) ' R -> Editorial
.Add("genlib", db.Integer,, 1) ' R -> Genero
.Add("paglib", db.Integer) ' Numero de paginas
.Add("siplib", db.String) ' Sipnosis argumental
.Add("isbnlib", db.String, 14) ' ISBN - Numero de identificacion
.Add("stdlib", db.Boolean,, True)
End With
hTable.PrimaryKey = ["idlib"]
hTable.Update
Endif
End


Y observo esto, por poner una.
...
.Add("autlib", db.Integer,, 1) ' R -> Autor


Cuando fui a la ayuda de gambas encontré que el ultimo valor es tipo Variant.
Sub Add ( Name As String, Type As Integer [ , Length As Integer, Default As Variant ] )


¿ Es así como se relacionan las tablas usando esta función ?. Dicen que si este valor no se especifica su valor es nulo.
Solo le ha dado un valor 1, saltándose el tamaño del campo.

Referencia:

http://www.gambasdoc.org/help/comp/gb.db/.table.fields/add?v3

Saludos

Objetivo: Re: Crear Base De Datos SQLITE Por Codigo
De lo de si es función o procedimiento por las prisas... yo qué sé, que ni me acuerdo, oiga.

De lo de crear por código, yo lo hago con sql. Hay una forma muy simple.

Creas la tabla con sqliteman, por ejemplo. Luego botón derecho y "describe table". Ahí te muestra el código de definición de la tabla. Copiar y pegar en una .exec de la conexión y todo listo.

No será lo más ortodoxo, pero es lo más simple.

Saludos.

Perfil MP  

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.552s (PHP: -40% SQL: 140%)
Consultas SQL: 46 - Debug off - GZIP Activado