RSS

Acceso a Bases de Datos SQLite desde Gambas

domingo, 14 de diciembre de 2008

Nuevamente volvemos a sumar más documentación integrando el pseudo motor de Bases de Datos SQLite y un lenguaje de programación visual que día a día esta atrapando a más programadores de plataformas libres como es Gambas.

En esta oportunidad les voy a dejar el enlace de la revista digital Tuxinfo Nº12 en la cual Pablo Mileti explica en 8 páginas como acceder y realizar consultas y actualizaciones integrando esta dos herramientas SQLite y Gambas y de alguna manera podemos complementar la información con lo que Marcos hace unas semanas atrás mostraba.


Integridad Referencial

La integridad referencial es una propiedad
deseable en las bases de datos. Gracias a la integridad referencial se garantiza que una entidad (fila o registro) siempre se relaciona con otras entidades válidas, es decir, que existen en la base de datos. Implica que en todo momento dichos datos sean correctos, sin repeticiones innecesarias, datos perdidos y relaciones mal resueltas.
Como es sabido por la los desarrolladores de SQLITE , la integridad referencial no esta implementada de forma mativa pero es posible realizar la emulacion de la misma atravez de los trigger.
Extraido de la Wikipedia : www.wikipedia.org
El Siguiente Ejemplo fue extradido de la wiki del "El Server" - http://www.elserver.com/wiki/
=========================================================
La tabla PELICULAS tiene dependencia de otras dos: GENERO y SOPORTE.

Los triggers antes de insert y antes de update on Peliculas tienen en cuenta estas dos dependencias.
Para antes de delete hacen falta dos triggers: uno en Genero y otro en Soporte.
Estos triggers impiden que se pueda borrar un genero o un soporte, si hay peliculas que lo están
usando.
El código deja claro lo que se haría si la dependencia fuera de más tablas,sólo habría que añadir más OR y los triggers on delete.
Si la dependencia fuera solo de una tabla,se quitaría un OR y el delete que sobre.

CREATE TABLE [genero] (
[id_gen] INTEGER PRIMARY KEY NOT NULL,
[nombreGen] VARCHAR(40) UNIQUE NOT NULL
);

CREATE TABLE [soporte] (
[id_sop] INTEGER NOT NULL PRIMARY KEY,
[nombreSop] VARCHAR(20) UNIQUE NOT NULL
);

CREATE TABLE [peliculas] (
[id_pel] INTEGER NOT NULL PRIMARY KEY,
[id_genero] INTEGER NOT NULL,
[id_soporte] INTEGER NOT NULL,
[nombrePel] VARCHAR(40) NOT NULL
);

CREATE TRIGGER film_pel_in before insert on peliculas
for each row
begin
select case
when
(
(new.id_soporte is not null)
and
(new.id_genero is not null)
and
(
((select id_sop from soporte where
id_sop =new.id_soporte) is null)
or
((select id_gen from genero where
id_gen = new.id_genero) is null)
)
)
then raise(abort,'violacion integridad')
end;
end;

CREATE TRIGGER film_pel_up before update on peliculas
for each row begin
select case
when
(
((select id_sop from soporte where
id_sop = new.id_soporte) is null)
or
((select id_gen from genero where
id_gen = new.id_genero) is null)
)
then raise(abort,'violacion integridad')
end;
end;

CREATE TRIGGER film_sop_de before delete on soporte

for each row begin
select case
when
((select id_soporte from peliculas
where id_soporte = old.id_sop) is not null)
then raise(abort,'violacion integridad')
end;
end;

CREATE TRIGGER film_gen_de before delete on genero
for each row begin
select case
when
((select id_genero from peliculas
where id_genero = old.id_gen) is not null)
then raise(abort,'violacion integridad')
end;
end;


Pequeña Consulta en SQLite3 utilizando el lenguaje C

lunes, 1 de diciembre de 2008

Hace algunas semanas hemos recivido , de parte de uno de los desarrolladores "Ricardo D. Quiroga" de la comunidad un ejemplo de como implementar SQLite en el Languaje C. A Quien Agradesemos el Envio de este miniComo..

Basado en el ejemplo posteado en http://www.sqlite.org/quickstart.html
Autor: Ricardo D. Quiroga -> l2radamanthys@gmail.com
El codigo fuente posteado aqui esta bajo licencia GPL2 (license.txt)
Codigo fuente Probado usando el Dev-C++ y el Compilador GCC 
#include
El autor no se hace responsable del daño que el mismo pudiese causar directa o indirectamente a tu computadora ,novia,, perro, Y/O SUEGRA ,ect. use el mismo bajo su propia responsabilidad.
Se Incluyen los siguientes archivos:
* libreria sqlite
- sqlite3.h
- libsqlite3.a
- sqlite3.dll

* codigo fuente
- main.c (Codigo fuente)
- main.c.html (vercion del codigo fuente para visualizar como html)
- test1.dev  (archivo de proyecto (solo para Dev-C++) )

Aunque fue el Codigo fue probado con el Dev-C++ usando el GCC el mismo tambien deveria poderse compilar usando cualquier otro ya que el mismo solo fue escrito en ANSI C

Sobre la BD:
Crear una BD con el nombre 'test.db'(o cambiar el nombre de la bd en el codigo fuente) a la cual luego se le agregara una tabla llamarla 'table1' y colocarle los camposo que ud eligan

Que hace el programa:
Conecxta una base de datos a SQLite realiza una pequeña consulta con SQLite en este ejemplo la consulta es la siguiente "select * from table1;" muestra los resultados en pantalla y cierra la bd.
/*****************************************************************************************
     
  ------  Una Simple consulta en SQLITE Usando C  ------       
         Probado con el Dev-C++ Usando el  GCC       
   Por Ricardo D. Quiroga  - l2radamanthys@gmail.com       
   Este ejemplo esta basado en el codigo posteado en http://www.sqlite.org/quickstart.html       
      Quitando los Comentarios son como 25 lineas       

*****************************************************************************************/

#include
#include
#include //libreria para trabajar con SQLite3

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
    for( int i=0; i
        printf("%s ", argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main(int argc, char **argv) {

    sqlite3 *db;    //variable que hara referencia a la Base de Datos que utilzaremos
    char *zErrMsg;  //string que almacenara el mensaje de error
    int rc;         //amacenara el resultado del llamado de las funciones de sqlite3.h
    
  /*****************************************************************************************
    Abrimos la base de Datos en nuestro caso la BD se llamara 'test.db'

    int sqlite3_open(
        const char *filename,   Nombre de la Base de Datos (UTF-8)
        sqlite3 **ppDb          Salida SQLite db handle
    );
    
    En caso de error la funcion sqlite3_open() devolvera un valor distinto de 0
    *****************************************************************************************/
    rc = sqlite3_open("test.db", &db);
    
 /*****************************************************************************************
    Mostramos el mensaje de error en caso de que no se pudiera abrir la Base de Datos
    *****************************************************************************************/
    if (rc) {
        fprintf(stderr, "No se pudo Abrir la base de Datos: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        exit(1);
    }
    
  /*****************************************************************************************
    Strings que alamcenaran las consulta que relizamos en la que Copiaremos la instrucion de
    SQLite que queremos ejecutar en la variable 'instrucion' en este caso una simple consulta
    a la Base de Datos
    *****************************************************************************************/
    char instrucion[1024]="";
sprintf(instrucion, "SELECT * FROM table1;");

 /*****************************************************************************************
    Ejecutamos la instrucion alamcenada en el string instrucion en SQLite3
    
    Esplicacion mas a fondo de la funcion 'sqlite3_exec()'
    
    int sqlite3_exec(
        sqlite3*,                                  Base de Datos Abierta
        const char *sql,                           Instrucion de SQl a evaluar
        int (*callback)(void*,int,char**,char**),  funcion (Callback) ver arrina
        void *,                                    1er agumento de la funcion Callback
        char **errmsg                              variable de mensaje de error (1)
    );
    
    si ocurrio un error durante la ejecucion de la instrucion la la funcion devolvera un valor
    diferente de la constante SQLITE_OK y el tipo de error sera devuelto en la variable errmsg(1)
    *****************************************************************************************/
    rc = sqlite3_exec(db, instrucion, callback, 0, &zErrMsg);
    
 /*****************************************************************************************
    En caso que ocurriera un error en la ejecucion de la instrucion SQL mostramos el mismo
    *****************************************************************************************/
    if ( rc!=SQLITE_OK ) 
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
    }
    
  /*****************************************************************************************
    funcion para cerrar la Base de Datos ( Sin comentarios....)
    *****************************************************************************************/
    sqlite3_close(db); 
    
    printf("\n");
    system("PAUSE"); //pausamos la ejecucion del programa par aque no se cierre la consola

    return EXIT_SUCCESS;
} //fin del programa.....


Este programa fue desarrollado como ejemplo de uso de SQLite para SQLite-Latinoamerica 
Ricardo D. Quiroga