Sei sulla pagina 1di 7

Bases de datos con Gambas, Conexión y Creación de bases de datos

Posted on julio 17, 2010 by willicab

Este Articulo lo copio de mi blog anterior, espero poder continuar una serie de tutoriales de Gambas, claro, todo
dependerá de sus comentarios

A pesar de lo que me gusta desarrollar con Gambas y el tiempo que llevo haciéndolo, nunca he publicado un
artículo, tutorial o lo que sea sobre este maravilloso entorno de programación, así que comenzaré por algo
sencillo para ir poco a poco profundizando sobre este tema, bases de datos con Gambas .

Conectándonos a una base de datos

Antes que nada es necesario activar el componente de Bases de datos (gb.db) en la pestaña componentes de
la ventana propiedades en el menú Proyecto, luego podemos usar un código como este:

PUBLIC HConn AS Connection

PUBLIC SUB Main()


HConn = NEW Connection
HConn.Type = "mysql"
HConn.Host = "localhost"
HConn.Login = "root"
HConn.Password = ""
HConn.Name = "basedatos"
HConn.Open
END

En la primera línea declaramos una variable de tipo Connection yo la hice pública que pueda ser usada en otros
módulos del proyecto en dado caso

En el procedimiento Main creamos primero el objeto y luego colocaremos algunos datos necesarios para iniciar
la conexión, cabe destacar que estos datos son los unicos que deben modificarse, por ejemplo, el codigo
anterior funcionará tanto para mysql, si quieres conectarte usando SQLite solo tendrías que colocar la ruta de la
base de datos en la propiedad Host e ignorar las propiedades Login y Password, para conectar con ODBC es
relativamente mas complicado, aquí les dejo Un Link con un tutorial al respecto.

Crear una base de datos

En el ejemplo anterior tenemos la siguiente linea de código:


HConn.Name = "basedatos"

La propiedad Name indica el nombre de la base de datos a la que nos queremos conectar, pero es posible que
esa base de datos aún no exista, en ese caso nos daria el siguiente error:

Cannot open database: Unknown database ‘basedatos’

Podemos modificar el código para crear la base de datos en caso de que esta no exista, por ejemplo:

PUBLIC HConn AS Connection

PUBLIC SUB Main()


HConn = NEW Connection
HConn.Type = "mysql"
HConn.Host = "localhost"
HConn.Login = "root"
HConn.Password = ""
HConn.Name = "basedatos"
HConn.Open

IF NOT HConn.Databases.Exist("basedatos") THEN


HConn.Databases.Add("basedatos")
ENDIF

HConn.Close
HConn.Name = "basedatos"
Hconn.Open
END

Podemos ver varios cambios, en primer lugar vemos que ya no nombramos la base de datos antes de abrir la
conexión, primero verificamos con esta linea:
IF NOT HConn.Databases.Exist("basedatos") THEN

Si existe o no la base de datos, si no existe la creamos con la siguiente función:


HConn.Databases.Add("basedatos")

Luego que ya tengamos la base de datos creada debemos cerrar la conexión para nombrar la base de datos
como parametro:
HConn.Close
HConn.Name = "basedatos"
Hconn.Open

Ya con esto nos evitamos la posibilidad de que ocurra un error al no existir la base de datos, claro que una base
de datos contiene tablas y campos que también pueden crearse desde el código.

Ahora que ya sabemos como crear una base de datos y conectarnos a ella, procederemos a crear tablas y sus
respectivos campos en esa base de datos.
DIM hTabla as Table
hTabla = $hConn.Tables.Add("tabla")

hTabla.Fields.Add("id", db.Serial)
hTabla.Fields.Add("campo1", gb.String, 16, "Sin Nombre")
hTabla.Fields.Add("campo2", db.Integer,, 1)
hTabla.Fields.Add("campo3", gb.Date)
hTabla.Fields.Add("campo3", gb.Boolean)
hTabla.Fields.Add("campo4", gb.Float)

hTabla.PrimaryKey = ["id"]

hTabla.Update

Primero declaramos una variable de tipo Table, luego con la función


hTabla = $hConn.Tables.Add(Nombre_De_La_Tabla)

Creamos una nueva tabla en la base de datos que guardaremos en hTabla.

El siguiente paso es crear los campos, para eso usamos la función


hTabla.Fields.Add(Nombre, Tipo, Tamaño, Valor_Por_Defecto)

El primer parametro es el nombre del campo.

El segundo parametro es el tipo de dato que va a guardarse allí, los tipos disponibles son:
db.Blob = -2
db.Serial = -1
db.Boolean = 1
db.Integer = 4
db.Long = 5
db.Float = 7
db.Date = 8
db.String = 9

Asumo que los nombres de las constantes definen por si mismas por eso no las explico, a excepción de
db.Serial, esta constante define el tipo de datos auto_increment.

Luego está el tamaño del campo, y el valor por defecto, eso tampoco necesita mucha explicación.

Cuando ya tenemos todos los campos creados establecemos (en este caso) el campo “id” como clave primaria,
se darán cuenta en la linea
hTabla.PrimaryKey = ["id"]

Vemos que “id” está entre corchetes, esto es porque la variable PrimaryKey es una String Array por lo que
podemos agregar más de una clave primaria.

Al final actualizamos la tabla y listo, ya tenemos una tabla con sus campos.

Transacciones
Cuando Hablamos de una transacción en una base de datos nos referimos a una serie de cambios que, o todas
tienen exito o todas fracasan, por ejemplo, si estamos intentando cambiar un registro, pero en alguno no
coindiden los tipos, entonces todo el proceso se tiene que revertir y no se guarda nada.

Crear Registros
Lo primero que hacemos es iniciar la transacción con
$hConn.Begin

Luego creamos un objeto Result con el método Create


hRes = $hConn.Create("tabla")

Esto nos crea un registro vacio donde vamos a establecer los datos del registro:
hRes!campo1 = "Registro #1"
hRes!campo2 = 300
hRes!campo3 = Date(Now())
hRes!campo4 = TRUE
hRes!campo5 = 2235644.232

El objeto Result también puede usarse como un Array para guardar los datos, sería algo como esto:
hRes["campo1"] = "Registro #1"
hRes["campo2"] = Rnd(200, 20000)
hRes["campo3"] = Date(Now())
hRes["campo4"] = TRUE
hRes["campo5"] = 2235644.232

Una ventaja al hacerlo de esta manera es que podemos por ejemplo usar variables en lugar de cadenas,
pudiendo potimizar mas el código, la opciones son variadas.
Luego se actualiza el registro, para guardar estos datos:
hRes.Update

Con esto nos aseguramos de que ingresen los datos al registro, finalmente cerramos la transacción:
$hConn.Commit

En caso de error echamos todo el proceso para atras:


CATCH
$hConn.Rollback

Podemos ver el código completo acá:


DIM hRes as Result

$hConn.Begin

hRes = $hConn.Create("tabla")

hRes!campo1 = "Registro #1"


hRes!campo2 = Rnd(200, 20000)
hRes!campo3 = Date(Now())
hRes!campo4 = TRUE
hRes!campo5 = 2235644.232

hRes.Update

$hConn.Commit

CATCH
$hConn.Rollback

Buscar Registros
Para buscar un registro podemos usar el método Find del objeto Collection:
hRes = $hconn.Find("tabla") ' Esto es equivalente a SELECT * FROM tabla

Esto crea un objeto Result de solo lectura que nos guardará, en este caso buscamos todos los datos que están
guardados en la tabla, podemos filtrar con la clausula where de esta manera:
hRes = $hconn.Find("tabla", "campo2 < 10000") ' Esto es equivalente a SELECT * FROM tabla WHERE
campo2 < 10000

Con esta tendremos como resultado todos los registros cuyo valor para campo2 sea menor a 10000.

Solo nos queda enumerar la salida


FOR EACH hRes
PRINT hRes!campo1
PRINT hRes!campo2
PRINT hRes!campo3
PRINT hRes!campo4
PRINT hRes!campo5
NEXT

Al final el código nos queda así:


DIM hRes AS Result

hRes = $hconn.Find("tabla", "campo2 < 10000")


FOR EACH hRes
PRINT hRes!campo1
PRINT hRes!campo2
PRINT hRes!campo3
PRINT hRes!campo4
PRINT hRes!campo5
NEXT
Editar un Registro
Lo primero que debemos hacer es iniciar una transacción
$hconn.Begin
Luego creamos un objeto Result de lectura y escritura usando la función Edit de la clase Connection, al igual
que la función Find usaremos como primer parametro el nombre de la tabla y como segundo parametro la
clausula where para obtener resultados mas precisos.
hRes = $hconn.Edit("tabla", "campo2 < 10000")
En este caso buscará todos los registros cuyo valor de campo2 sea menor a 10000, generalmente se busca
editar un solo registro, para esto buscamos por ejemplo el campo que sea clave primaria que en nuestro
ejemplo es id.
Ahora editamos los campos.
FOR EACH hRes
hRes!campo1 = "Campo con valor menor a 10000"
hRes.Update
NEXT
En este caso iremos registro por registro editando campo1, es importante que luego se coloque la linea
hRes.Update para guardar los registros, si solo van a editar un registro no necesitar usar el FOR EACH.
Otra cuestión que hay que acotar es sobre el limite que le colocamos a los campos, si recordamos en el
TutoGambas #2 habíamos creado campo2 como un campo de tipo string y una longitud de 16 caracteres pero
en la edición colocamos una cadena de 29, no nos dará error pero si vemos el resultado solo nos guardará
“Campo con valor “.
Finalizamos cerrando la transacción.
$hconn.Commit
O devolviendola si ha ocurrido un error.
CATCH
$hconn.Rollback
El código completo se vería así.
DIM hRes AS Result

$hconn.Begin
hRes = $hconn.Edit("tabla", "campo2 < 10000")

FOR EACH hRes


hRes!campo1 = "Campo con valor menor a 10000"
hRes.Update
NEXT
$hconn.Commit

CATCH
$hconn.Rollback

El método Exec
Si alguno de métodos anteriores se queda corto siempre podemos crear nuestras propias sentencias SQL
usando el el metodo Exec
hRes = hConn.Exec("Tu sentencia SQL")
Este método siempre va a devolver un objeto Result aunque no será necesario en todos los casos.
El DATAVIEW únicamente muestra los datos, pero quien obtiene esos datos es un DATASOURCE que en
gambas es un objeto contenedor. Se requiere además una conexión activa a una base de datos.
Así pues, si en un formulario queremos usar un objeto DATAVIEW deberemos crear un conectar primero un
objeto connection activo
Código:
Dim Cn as connection
Cn=new connection
Cn.type="mysql"
Cn.host="localhost"
Cn.Port="3306"
Cn.login="usrlibreria"
Cn.password="clave_usr"
Cn.name="LIBRERIA"
try Cn.open() 'abrir la conexión

Situar el objeto con tenedor DATASOURCE en el formulario y poner las propiedades mínimas para obtener la
funcionalidad
Código:
Datasource.table="autores" tabla o vista de donde saldrán los datos
Datasource.filter=" la condición que iría tras un where en una claúsula select"
Datasource.readonly=true o false
Situar el objeto DATAVIEW dentro del con tenedor DATASOURCE y poner las
propiedádes mínimas para obtener la funcionalidad
En Columns indicar el orden de campos de tabla que aparecerán en el DATAVIEW

Como añadido (por habitual) aunque no necesario conviene comprobar las propiedades
Código:
dataview.grid=true/false si se va a mostrar rejilla o no
dataview.mode=none/single si se va a seleccionar la fila elegida o no.
Definir las cabecera s y el a n ch o de columnas
Código:
with dataview.gridview
.columns[0].text="Código"
.columns[0].width=50
.columns[1].text="Autor"
.columns[1].width=20
end with

Obtener la fila seleccionada


Código:
dim fila as integer
fila=dataview.gridview.row

Obtenerla columna seleccionada


Código:
dim columna as integer
columna=dataview.gridview.col

Posicionarse en las celdas


Código:
Dataview.GridView[0,0] ----> primera celda
Dataview.GridView[1,0] ----> primera celda segunda fila
Dataview.GridView[,0] ----> primera celda segunda fila
Dataview.GridView(DataView.GridView.row,DataView.GridView.col] ---> celda actual

Obtener los datos de la fila seleccionada


Código:
dim Codigo as integer, Autor as string
Codigo=dataview.gridview[fila,0].text
Autor=dataview.gridview[fila,1].text

Por último al hacer algún cambio en el recordset subyacente, para que se


actualice la información mostrada se deberá refresca r el objeto
DATASOURCE.
Código:
datasource.refresh

GAMBAS… Levantate y Habla!!!

PUBLIC SUB Bienvenido()


EXEC ["aoss", "espeak", "-ves", "-s130", "?Bienvenido,a,Gambas,ya,puedo,hablar"]
END

PUBLIC SUB Salida()


EXEC ["aoss", "espeak", "-ves", "-s130", "?Gracias,por,usar,Gambas,vuelva,pronto"]
END

‘modulo Voces
PUBLIC FUNCTION Bienvenido(OPTIONAL TextBox AS String)
EXEC ["aoss", "espeak", "-ves", "-s145", TextBox]
END

en FMain
PUBLIC SUB Button1_Click()
Voces.Bienvenido(txtnombre.Text)
END

Potrebbero piacerti anche