Comme cadeau de bienvenue, un exemple qui montre quelques méthodes PureBasic, dont les
requêtes préparées
Cet exemple n'est pas optimisé, mais réponds en même temps à un certains nombre de questions que se posent les nouveaux arrivants en PB venant d'autres langages
- L'utilisation des requêtes préparées (Prepared statement) pour saisir tout type de caractère y compris apostrophes et guillemets.
- La gestion des bases SQLite (création depuis zéro et utilisation)
- La façon de vérifier l’existence d'une ressource (fichier, handle de fichier, connexion à une base de données) avant utilisation
- Les énumérations qui permettent d'affecter des valeurs aux constantes en étant sûr de leur unicité
- Les chaines de caractères avec séquences d'échappement ~"..."
- La façon d'éviter les fautes de frappe en forçant la demande de définition de variable (EnableExplicit)
- Comment gérer les raccourcis clavier
- Remplir et vider un gadget liste liste
- La boucle d'évènement principale (toujours une seule)
Exemple complet. Copier/coller/lancer
Saisir une chaine comme
You know what I'm "Happy"
Valider.
Tous les caractères sont bien stockés dans la base, y compris accents et guillemets
Code : Tout sélectionner
EnableExplicit
UseSQLiteDatabase()
Enumeration
#Win
#Str_Edt
#Btn_Submit
#Lst_Rec
#DB
#Kbd_Return
EndEnumeration
OpenWindow (#Win, 0, 0, 500, 300, "Test caractères spéciaux", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StringGadget (#Str_Edt, 10, 10, 480, 20, "")
ButtonGadget (#Btn_Submit, 10, 40, 480, 30, "Enregistrer dans la base")
ListViewGadget(#Lst_Rec, 10, 80, 480, 210)
; Le gadget actif est la zone de saisie
SetActiveGadget(#Str_Edt)
; Le bouton peut être validé par la toucvhe entrée
AddKeyboardShortcut(#Win, #PB_Shortcut_Return, #Kbd_Return)
; --- Création ou utilisation d'une base SQLite (dans %temp%)
; La variable est de type globale pour être accessible dans la procédure
Global DB_Name$ = GetTemporaryDirectory() + "DB_Test.sqlite"
If FileSize(DB_Name$) = -1 ; Fichier inexistant
Debug "La base de test n'existe pas. Création"
; Pour créer une base SQL il faut commencer par créer un fichier vide
If CreateFile(#DB, DB_Name$, #PB_UTF8)
Debug "Fichier créé"
CloseFile(#DB)
; Ensuite on ouvre ce fichier (vide) en mode mise à jour
If OpenDatabase(#DB, DB_Name$, "", "")
Debug "Connecté à la base " + GetFilePart(DB_Name$)
If DatabaseUpdate(#DB, "CREATE TABLE test(test TEXT)")
Debug "Table créée"
Else
Debug "Ne peux créer la table dans la base"
Debug "Erreur: " + DatabaseError()
EndIf
EndIf
Else
Debug "Ne peut créer le fichier SQlite" : End
EndIf
Else
; ~ devant une chaine permet d'utiliser les caractères d'échappement \n\r\t etc
Debug ~"La base " + DB_Name$ +
~" existe.\nLes données seront ajoutées"
EndIf
Procedure Load_DataBase()
; Charge les anciennes données si la base existe
If OpenDatabase(#DB, DB_Name$, "", "")
If DatabaseQuery(#DB, "SELECT * FROM test")
Debug "Lecture OK"
; Grâce à la fonction DatabaseQuery() on peut lister la base ligne par ligne
While NextDatabaseRow(#DB)
; Puis on ajoute simplement le contenu de la colonne 1 dans la liste
AddGadgetItem(#Lst_Rec, -1, GetDatabaseString(#DB, 0))
Wend
EndIf
Else
Debug "Pas d'anciennes données ou base de données"
ProcedureReturn
EndIf
EndProcedure
Procedure Write_DataBase()
; --- Ecriture dans la base
; Si elle n'est pas ouverte, on l'ouvre
If Not IsDatabase(#DB) : OpenDatabase(#DB, DB_Name$, "", "") : EndIf
; On prend ce que l'utilisateur a saisi
Define Query_Input$ = GetGadgetText(#Str_Edt)
; On le met tel quel dans une zone mémoire
SetDatabaseString(#DB, 0, Query_Input$)
; ? va mettre tout le contenu dans la requète (y compris '") sans influencer la requête
If DatabaseUpdate(#DB, "INSERT INTO test VALUES (?)")
Debug "INSERT OK [" + Query_Input$ + "]"
; Pour vérifier, je relis toute la base
; Vider le gadget car on va tout relire
ClearGadgetItems(#Lst_Rec)
; Lire tous les champs
If DatabaseQuery(#DB, "SELECT * FROM test")
Debug "Lecture OK"
; Grâce à la fonction DatabaseQuery() on peut lister la base ligne par ligne
While NextDatabaseRow(#DB)
; Puis on ajoute simplement le contenu de la colonne 1 dans la liste
AddGadgetItem(#Lst_Rec, -1, GetDatabaseString(#DB, 0))
Wend
Else
Debug "INSERT KO " + DatabaseError()
EndIf
EndIf
SetGadgetText(#Str_Edt, "")
EndProcedure
Load_DataBase()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
; Si la base était ouverte, on la referme
If IsDatabase(#DB)
CloseDatabase(#DB)
EndIf
End
Case #PB_Event_Gadget
If EventGadget() = #Btn_Submit
Write_DataBase()
EndIf
Case #PB_Event_Menu
; Un raccourci clavier est traité comme un évènement de type menu
If EventMenu() = #Kbd_Return
Write_DataBase()
EndIf
EndSelect
ForEver
End
Ce programme:
- Créé une base SQLite (dans le répertoire temporaire)
- Si la base existe, les données sont lues
- Quand on saisi une ligne, elle est mise en base
- La liste est vidée
- La base est relue et la liste remplie à nouveau
(on peut se contenter d'ajouter juste la nouvelle ligne, mais là c'est pour expliquer au plus simple)