Page 1 sur 1

[OK]PB SQLITE et DATETIME

Publié : lun. 19/sept./2022 13:01
par Ar-S
Salut, je pète un cable.
Depuis hier j'essaye d'insérer via PB des date en SQLITE.. Sans succés.
ça doit être une histoire de syntaxe mais je vois pas pourquoi.. Si j'entre mes requêtes via une interface sqlite ça fonctionne mais pas via PB.
Les enregistrements se font (incrémentation de ID) mais le champ dateR reste vide (je l'ai mis à NULL donc pas d'erreur)

J'ai découpé mon code en procédures.
C'est à insert que ça chie. Vous pouvez le tester. Enregistrez au préalable le code dans un fichier pour que la bdd se créée au même endroit.

D'avance merci, ça me gonfle de bloquer là dessus.

Code : Tout sélectionner

UseSQLiteDatabase()

Enumeration 
    #Fichier
    #MaBase
EndEnumeration


Global Filename$ = GetCurrentDirectory()+"bbDate2.sqlite"
Global TableName$ = "datetest"
Global id$ = "id"
Global ColDate$ = "dateR"

;**********************************
;       GESTION DE LA BASE
;**********************************
Procedure.b CreerFichier()
    If OpenFile(#Fichier, Filename$,#PB_File_SharedWrite)
        Debug "Fichier de base de données ouvert"
        CloseFile(#Fichier)
        Debug "Fichier créé"
        ProcedureReturn 1
    Else
        Debug "Erreur création du fichier"
        ProcedureReturn 0
    EndIf
EndProcedure

Procedure.b CreerBase()
        If OpenDatabase(#MaBase, Filename$, "", "")
            Requete$ = "CREATE TABLE "+TableName$+" ("+id$+" INTEGER PRIMARY KEY AUTOINCREMENT, "+ColDate$+" DATETIME NULL);"
            Debug "requete créer : " + Requete$
            If DatabaseUpdate(#MaBase, Requete$)
                Debug "Table 'datetest' créée"
                ProcedureReturn 1
            Else
                erreur$ = DatabaseError()
                If FindString(erreur$,"exists") ; si la table existe déjà
                    Debug "Info : " + erreur$
                    ProcedureReturn 2
                EndIf
            EndIf
        Else
            erreur$ = DatabaseError()
            Debug "ERREUR : " + erreur$
            ProcedureReturn 0
        EndIf
    
EndProcedure

Procedure Insere(Base, dateR$)
    If OpenDatabase(#MaBase, Filename$, "", "")
        If DatabaseQuery(#MaBase, "SELECT * FROM "+TableName$) ; Recupère tous les enregistrements 
            SetDatabaseString(Base, 1, dateR$)
            requete$ = "INSERT INTO "+TableName$+" ("+ColDate$+") VALUES (?)"
            Debug "Requête insert : " + requete$
            Result = DatabaseUpdate(Base, requete$)
            If Result = 0
                erreur$ = DatabaseError() + " "+ Str(#PB_Compiler_Line)
                Debug "Erreur : " + erreur$
            Else
                Result = 1
                Debug "Date ajoutée ! : "+ ColDate$ + " " + dateR$
            EndIf
            FinishDatabaseQuery(#MaBase)
        EndIf
    EndIf
    ProcedureReturn Result
EndProcedure


Procedure LisBase(NomColonne$="dateR")
   
    If OpenDatabase(#MaBase, Filename$, "", "")
        Debug "Connecté à PureBasic.sqlite"
        ; Si la base existe déjà, on lit les infos des contacts
        If DatabaseQuery(#MaBase, "SELECT * FROM "+TableName$) ; Recupère tous les enregistrements
            Debug "~ Liste des enregistrements ~"
            Debug "ID colonne " + DatabaseColumnIndex(#MaBase, id$) + " dateR colonne " + DatabaseColumnIndex(#MaBase, ColDate$)

                Debug "Affichage des données"
                While NextDatabaseRow(#MaBase)
                    Debug "ID : " + GetDatabaseString(#MaBase, 0) + " dateR : " + GetDatabaseString(#MaBase, 1) 
                Wend

            Debug "Fermeture de la requête"
            FinishDatabaseQuery(#MaBase)
                  
        EndIf
    EndIf
    
EndProcedure


; ---------- PROG -------------
CreerFichier()
CreerBase()
LisBase()
Insere(#Mabase, "2022-10-05 12:00:00")
; On lit à nouveau
LisBase()
Debug "Fermeture de la bdd"
CloseDatabase(#Mabase)

Re: PB SQLITE et DATETIME

Publié : lun. 19/sept./2022 14:29
par Marc56
Salut Ar-S

Simple oubli, tu as mis 1 au lieu de 0 comme index à SetDatabaseString()

Code : Tout sélectionner

SetDatabaseString(Base, 0, dateR$)
:wink:

Re: PB SQLITE et DATETIME

Publié : lun. 19/sept./2022 15:02
par Ar-S
Pfff .. Mais alors pourquoi ?
Dans ma BDD j'ai la colonne ID qui est 0 et donc dateR est 1..
Je pige pas ce que c'est que ce 0 dans SetDatabaseString(Base, 0, dateR$)

Re: PB SQLITE et DATETIME

Publié : lun. 19/sept./2022 15:15
par Marc56
Je pige pas ce que c'est que ce 0 dans SetDatabaseString(Base, 0, dateR$)
Copier le contenu de dateR dans la zone mémoire #0 tu tableau des variables de liaison.

SetDatabaseString() est indépendant des gadgets. C'est juste un tableau de variables.

Le numéro d'index est à incrémenter manuellement à chaque appel d'une fonction SetDatabase... ()
On n'est donc pas forcé de "mapper" toutes le variables, mais il faut les réutiliser dans l'ordre.

Dans la requête, chaque '?' sera remplacé à partir de 0

Il cherche donc 0, puis 1, puis 2 etc

Avec PostgreSQL c'est plus facile à gérer car il utilise $1 $1 $3

Re: PB SQLITE et DATETIME

Publié : lun. 19/sept./2022 15:28
par Ar-S
Ok.
Cette histoire d'index à incrémenter n'était pas très claire. Rien à voir avec le num des colonnes.
Merci pour la clarification.