Problème sqlite (RESOLU)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème sqlite

Message par falsam »

Un exemple d'une base de données en mémoire pour cette démonstration.

Dans les grandes lignes.

■ Mise en œuvre d'une base de données dont chaque enregistrement est composé du nom d'une image et du contenu de l'image.

Code : Tout sélectionner

 
; Creation d'une table de test
ReqSql = "CREATE TABLE test ("
ReqSql + "idauto INTEGER PRIMARY KEY,"    ;Identification auto
ReqSql + "filename TEXTE,"                ;Nom
ReqSql + "image BLOB"                     ;Image
ReqSql + ");"
■ Enregistrer une image.

Code : Tout sélectionner

      ;
; Ajout dans la base de données
ReqSql = "insert into test (fileName, image) values (?,?)"
SetDatabaseString (#DataBase, 0, GetFilePart(FileName))
SetDatabaseBlob   (#DataBase, 1, *Buffer, MemorySize(*Buffer))
DatabaseUpdate(#Database, ReqSql)
■ Lecture de l'image.

Code : Tout sélectionner

fileName = GetDatabaseString(#DataBase, 0)

blobSize = DatabaseColumnSize(#Database, 1) ; Obtenir la taille du BLOB
*buffer = AllocateMemory(blobSize)          ; Allouer une zone mémoire 
result = GetDatabaseBlob(#Database, 1, *buffer, blobsize)

If Result
  Image = CatchImage(#PB_Any, *Buffer, blobSize)
EndIf    
■ Code de test.

Code : Tout sélectionner

EnableExplicit

Enumeration window
  #mf
EndEnumeration

Enumeration gadget
  #mfSelect
  #mfShow
EndEnumeration

Enumeration misc
  #Database
  #ImageFile
EndEnumeration

;Sommaire
Declare InitDB()
Declare Start()
Declare SelectMedia()
Declare DatabaseShow()
Declare Exit()

UseSQLiteDatabase()
UseJPEGImageEncoder()
UseJPEGImageDecoder()
UsePNGImageEncoder()
UsePNGImageDecoder()

InitDB()
Start()

Procedure InitDB()
  Protected ReqSql.S
  ;Ouverture et création de la base de données en mémoire
  OpenDatabase(#DataBase, ":memory:", "", "")
  
  ; Creation d'une table de test
  ReqSql = "CREATE TABLE test ("
  ReqSql + "idauto INTEGER PRIMARY KEY,"    ;Identification auto
  ReqSql + "filename TEXTE,"                ;Nom
  ReqSql + "image BLOB"                     ;Image
  ReqSql + ");"
  DatabaseUpdate(#DataBase, ReqSql)
EndProcedure

Procedure Start()  
  OpenWindow(#mf, 0, 0, 800, 600, "Images dans une base de donnée", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  ButtonGadget(#mfSelect, 20, 20, 150, 24, "Selectionner une image")
  ButtonGadget(#mfShow, 20, 50, 150, 24, "Voir toutes les images")
  
  ; Déclencheurs
  BindGadgetEvent(#mfSelect, @SelectMedia())
  BindGadgetEvent(#mfShow, @databaseShow())  
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  ; Loop
  Repeat : WaitWindowEvent(1000) : ForEver   
EndProcedure

;Selection d'une image
Procedure SelectMedia()
  Protected ReqSql.s
  Protected Pattern.s = "Image Files (*.bmp, *.jpg, *.png)|*.bmp;*.jpg;*.png"
  Protected FileName.s = OpenFileRequester("Sélectionner une image", "", Pattern, 0)
  Protected *buffer, length
  
  If FileName <> ""  
    ; Lecture de l'imafge
    If ReadFile(#ImageFile, FileName)
      length = Lof(#ImageFile)
      *buffer = AllocateMemory(length)
      ReadData(#ImageFile, *buffer, length)
      CloseFile(#ImageFile)
      
      ; Ajout dans la base de donnée
      ReqSql = "insert into test (fileName, image) values (?,?)"
      SetDatabaseString (#DataBase, 0, GetFilePart(FileName))
      SetDatabaseBlob   (#DataBase, 1, *Buffer, MemorySize(*Buffer))
      DatabaseUpdate(#Database, ReqSql)
      
      ; Libérer la zone mémoire
      FreeMemory(*buffer)
    EndIf
  EndIf
  
EndProcedure

Procedure DatabaseShow()
  Protected window
  Protected fileName.s, *buffer, blobSize, image, result
  
  DatabaseQuery(#DataBase, "SELECT fileName, image FROM test")
  
  While NextDatabaseRow(#Database)
    ; Obtenir nom de l'image. Colonne 0 (c'est facile)
    fileName = GetDatabaseString(#DataBase, 0)
    
    ; Obtenir contenu de l'image. Colonne 1 (Un peu plus compliqué)
    blobSize = DatabaseColumnSize(#Database, 1) ; Obtenir la taille du BLOB
    *buffer = AllocateMemory(blobSize)          ; Allouer une zone mémoire 
    result = GetDatabaseBlob(#Database, 1, *buffer, blobsize)
    
    ; Voir le résultat
    If Result
      Image = CatchImage(#PB_Any, *Buffer, blobSize)
      Window = OpenWindow(#PB_Any, 0, 0, ImageWidth(image), ImageHeight(image), filename, #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
      ImageGadget(#PB_Any, 0, 0, 0, 0, ImageID(image))      
      StickyWindow(window, #True)
    EndIf
  Wend  
EndProcedure

Procedure Exit()
  Protected window = EventWindow()
  If window <> #mf
    CloseWindow(window)
  Else
    End
  EndIf
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Problème sqlite

Message par MetalOS »

Super merci falsam.
Avatar de l’utilisateur
MetalOS
Messages : 1509
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Problème sqlite

Message par MetalOS »

Tous fonctionne nickel, encore merci les gars.
Répondre