Pour ceux qui veulent utiliser la puissance de SQL pour faire leur propre base de données, il existe SQLite. Pour montrer un exemple d'utilisation de SQLite, nous allons réaliser un programme de carnet d'adresse.
Notre base de données contiendra les champs suivant:
champ | description | Type de donnée SQL |
---|---|---|
nom | chaîne de caractères | |
prenom | chaîne de caractères | |
adresse | chaîne de caractères | |
tel |
Cet exemple a été écrit en langage basic Panoramic. Il génère une petite base de données et insère des éléments dans une table via des commandes SQL standards.
DIM DB_NAME$:DB_NAME$="contact.db" DIM DB_OUTPUT:DB_OUTPUT=200 DIM DB_NB_ENREGISTREMENT DIM ExecSQL$:ExecSQL$="sqlite3.exe "+DB_NAME$+" " DLL_ON "Utils.dll" DLIST DB_OUTPUT: ' sortie de SQLite LIST 1:FONT_NAME 1,"Courier new" WIDTH 1,200:LEFT 1,100:HEIGHT 1,HEIGHT(0)-80 CreateDB(DB_NAME$) SQL("SELECT COUNT(*) FROM Personne") DB_NB_ENREGISTREMENT=VAL(ITEM_READ$(DB_OUTPUT,1)) IF DB_NB_ENREGISTREMENT=0 InsertPersonne("Alain","PROVIST","84 Chemin de la foret","06032") InsertPersonne("Eleanor","MALLE","84 Chemin de la foret","06032") InsertPersonne("Sarah","FRECHY","84 Chemin de la foret","06032") InsertPersonne("Agathe","ZEUBLOUZE","84 Chemin de la foret","06032") InsertPersonne("Anne","ONIME","84 Chemin de la foret","06032") InsertPersonne("Delphine","TALARON","84 Chemin de la foret","06032") END_IF SQL("SELECT COUNT(*) FROM Personne") DB_NB_ENREGISTREMENT=VAL(ITEM_READ$(DB_OUTPUT,1)) CAPTION 0,"Nb enregistrement:"+ITEM_READ$(DB_OUTPUT,1) AfficheListeNom() DLL_OFF END SUB AfficheListeNom() SQL("SELECT nom,prenom FROM Personne ORDER BY nom ASC") IF COUNT(DB_OUTPUT)<>0 ListCopy(DB_OUTPUT,1) END_IF END_SUB SUB InsertPersonne(Prenom$,Nom$,Adresse$,tel$) DIM_LOCAL value$ Nom$=TRIM$(UPPER$(Nom$)) : Prenom$=TRIM$(LOWER$(Prenom$)) : Prenom$=UPPER$(LEFT$(Prenom$,1))+RIGHT$(Prenom$,LEN(Prenom$)-1) value$="SELECT nom,prenom FROM Personne WHERE nom='"+Nom$+"' AND prenom='"+Prenom$+"'" SQL(value$) IF COUNT(DB_OUTPUT)>0 MESSAGE "Désolé mais "+Nom$+" "+Prenom$+" est déjà présent dans la base." ELSE value$="NULL,'"+Nom$+"','"+Prenom$+"','"+Adresse$+"','"+tel$+"'" SQL("INSERT INTO Personne(rowid,nom,prenom,adresse,tel) VALUES("+value$+")") END_IF END_SUB SUB SQL(cmd$) DIM_LOCAL Dll_return,batch$ FILE_OPEN_WRITE 1,"tmp.sql" FILE_WRITELN 1,".output out.txt" : ' le résultat sera stocké dans le fichier out.txt ' FILE_WRITELN 1,".separator '#'" FILE_WRITELN 1,".mode column" : ' option non obligatoire (cf. doc sqlite) FILE_WRITELN 1,".width 10" : ' option non obligatoire (cf. doc sqlite) FILE_WRITELN 1,cmd$+";" FILE_CLOSE 1 batch$=ExecSQL$+chr$(34)+".read tmp.sql"+chr$(34) Dll_return = DLL_CALL1("ExecuteAndWait",ADR(batch$)) FILE_DELETE "tmp.sql" CLEAR DB_OUTPUT IF FILE_EXISTS("out.txt")=1 FILE_LOAD DB_OUTPUT,"out.txt":FILE_DELETE "out.txt" END_IF END_SUB ' Création de la table 'Personne' contenant les champs: ' nom, prenom, adresse et tel SUB CreateDB(name$) DIM_LOCAL Dll_return,batch$ FILE_OPEN_WRITE 1,"tmp.sql" FILE_WRITELN 1,"CREATE TABLE IF NOT EXISTS Personne(" FILE_WRITELN 1,"id INTEGER PRIMARY KEY AUTOINCREMENT," FILE_WRITELN 1,"nom VARCHAR(15)," FILE_WRITELN 1,"prenom VARCHAR(15)," FILE_WRITELN 1,"adresse VARCHAR(15)," FILE_WRITELN 1,"tel VARCHAR(15));" FILE_CLOSE 1 batch$ = ExecSQL$+chr$(34)+".read tmp.sql"+chr$(34) Dll_return = DLL_CALL1("ExecuteAndWait",ADR(batch$)) FILE_DELETE "tmp.sql" END_SUB ' Copie une liste dans une autre SUB ListCopy(a%,b%) DIM_LOCAL i% : i%=1 CLEAR b% WHILE (COUNT(a%)<>0) ITEM_ADD b%,ITEM_READ$(a%,i%) ITEM_DELETE a%,1 END_WHILE END_SUB
L'exécutable en ligne de commande SQlite3.exe se trouve ici :http://www.sqlite.org/download.html
La DLL qui contient la fonction ExecuteAndWait(). Cette fonction permet de lancer un batch de manière silencieuse (sans apparition de la fenêtre DOS) : Utils.zip
Klaus a fait également un travail remarquable avec son système de gestion de base de données. Son approche est différente par rapport à une base de données "classique" et mérite d'y jeter un coup d'oeil (voir ici).