Un gros chapitre ici qui traite des bases de données et le langage tcl et même tk.
Nous allons voir dans cette page comment interfacer une base de données SQLITE 3 avec Tcl et TK.
INTERfacer tlc avec sqlite3
Sous linux, Pour utiliser sqlite, il vous faut télécharger le paquet tclsqlite3 dans vos dépots.
2) Utiliser sqlite3
Pour utiliser sqlite dans notre programme, il suffit d'appeler le nom du fichier comme suit :
sqlite3 db1 ./contact.dat
Cela aura pour effet d'ouvrir la base de données contact.dat et de s'y connecter
db1 est le nom de la variable tcl. Nous pouvons lui donner le nom que nous voulons.
Nous allons créer une base de données qui nous servira pour notre exemple à but d'illustration par la pratique.
Notre base de données s'appelle contact.dat et contient une table nommée contact et plusieurs champs dans cette table ( nos colonnes) dont voici la liste :
Voici le code :
db1 eval {CREATE TABLE contact(id int, societe text, nom text, prenom text,\ adr1 text, cp text, ville text, tel text, port text, fax text, email text)}
L'antislash permet juste un retour à la ligne pour que cela soit plus lisible.
chaque colonne est définie par son nom et son type.
Pour ajouter une ligne dans la bdd je vous mets ici le code complet dans une procédure pour vous compreniez comment on peut l'écrire en tcl :
proc addcontact {a b c d e f g h i j} { sqlite3 db1 ./contact.dat set mescontacts [db1 eval { INSERT INTO contact ("societe","nom","prenom","adr1","cp","ville","tel","port","fax","email") VALUES ($a,$b,$c,$d,$e,$f,$g,$h,$i,$j) }] db1 close }
curieusement je dois créer une variable mescontacts qui ne me sert à rien et que je n'utilise pas mais cela ne fonctionne pas sans le set.
Supposons que nous voulons modifier une ligne dont je connais l'id (le 24 par exemple)
J'écris donc ceci :
proc editcontact { myid a b c d e f g h i j } { sqlite3 db1 ./contact.dat set mescontacts [db1 eval { UPDATE contact SET "societe" = $a,"nom" = $b, "prenom" = $c, "adr1" = $d, "cp" = $e, "ville" = $f, "tel" = $g, "port" = $h, "fax" = $i, "email" = $j WHERE "id" = $myid}] db1 close }
Pour supprimer une ligne, je vais écrire ce code:
proc delcontact { myid } { sqlite3 db1 ./contact.dat set mescontacts [db1 eval { DELETE FROM contact WHERE id = $myid }] db1 close }
Supposons que nous ayons une boite entry (dont la variable est monentry) pour saisir un texte et qu'à chaque appui du clavier sur un lettre je souhaite relancer une requête sqlite pour rafraichir le résultat instantanné, le code à écrire serait :
bind .n.o1.d.e5 <Key> { set marequete {SELECT * FROM contact WHERE societe LIKE '%$monentry%'}
...et cela ne fonctionne pas. Pour quelle raison à votre avis?
Tout simplement car après la variable $monentry, nous ne pouvons attacher les deux caractères en vert, et du coup, la chaine sqlite est imcomplète.
La parade est donc :
Poue écrire un code ASCII il faut utiliser l'antislash puis la valeur hexadécimale du symbole % soit 25. J'écris donc : \x25
Ensuite pour mettre bout à bout deux chaines de caractères il faut utiliser la commande string cat
Voici donc la requête complète :
set marequete [string cat {SELECT * FROM contact WHERE societe LIKE } '\x25$cc \x25']
C'est le code que j'utilise pour contrôler la base de données contact dans le logiciel que je développe tksociété. Parcourez le code du fichier fmcontact.tk et fdcontact.tk
J'ai interfacé une bdd sqlite avec une treeview, et le résultat est sympa.
Conserver jusqu'à la fin de la mise en page pour faciliter les insertions.