https://foro.gambas-es.org/viewtopic.php?f=3&t=247
-----------------------------------
destroyer
Miercoles, 02 Diciembre 2009, 19:37

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.


-----------------------------------
soplo
Miercoles, 02 Diciembre 2009, 19:43

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.
[url=http://foro.gambas-es.org/viewtopic.php?f=3&t=54]La clase connection

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

 :mryellow:


-----------------------------------
shordi
Jueves, 03 Diciembre 2009, 02:27

Re: Crear Base De Datos SQLITE Por Codigo
-----------------------------------
Prueba esto:
[code linenumbers=false syntax=gambas]
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
[/code]


-----------------------------------
fabianfv
Jueves, 03 Diciembre 2009, 17:01

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.

[code linenumbers=false syntax=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

[/code]

Verifica la sintaxis: [url=http://www.sqlite.org/lang.html]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.


-----------------------------------
ahtonio
Sabado, 30 Enero 2010, 00:44

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:

[code linenumbers=false syntax=gambas]
' 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 
[/code]

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


-----------------------------------
Shell
Sabado, 11 May 2013, 11:20

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

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.. :o 
Ayer la encontré y hoy no encontraba la manera, me acorde del usuario Ahtonio y busque sus mensajes.

Saludos


-----------------------------------
Shell
Sabado, 11 May 2013, 12:27

Re: Crear Base De Datos SQLITE Por Codigo
-----------------------------------
En este fragmento de código veo por primera vez esto:

[code linenumbers=false syntax=gambas]

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
[/code]

Y observo esto, por poner una.
[code linenumbers=false syntax=gambas]
...
.Add("autlib", db.Integer,, 1)      ' R -> Autor
[/code]

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

¿ 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


-----------------------------------
shordi
Sabado, 11 May 2013, 14:11

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.


