Seite 1 von 1

Problem mit GetDatabaseBlob (gelöst)

Verfasst: 08.10.2012 22:34
von MenschMarkus
Hallo zusammen,

zu meinem Problem, Ich kann zwar problemlos ein Bild in die SQLite DB schreiben, dieses aber nicht mehr auslesen. Zwar zeigt mir der Returnwert von GetDatabaseBlob() eine 1 an, aber Buffer und Size sind 0.

Der Vollständigkeit halber:
PureBasic Version 4.6

Code: Alles auswählen

Structure BildDaten
   \Buffer.l
   \Size.l
EndStructure
Etikett.BildDaten
Hier mal der Code zum Schreiben des Bildes:

Code: Alles auswählen

strTMP.s = OpenFileRequester("Lade Etikett 1","*.jpg","Bild Dateien|*.jpg;*.png;*.tif",0)  ;Bild Datei laden
ReadFile(#Etikett,strTMP.s)         ; Bildinformation lesen

Etikett\Size = Lof(#Etikett)         ; Bildgröße ermitteln
Etikett\Buffer = AllocateMemory(Etikett\Size)        ; Speicher reservieren
ReadData(#Etikett,Etikett\Buffer,Etikett\Size)       ; Daten in den Speicher schreiben
CloseFile(#Etikett)                                           ; Bild Datei schließen

CatchImage(#EtikettImage,Etikett\Buffer)            ; Bild vom Speicher lesen

IWidth = ImageWidth(#EtikettImage)                   ; Bildbreite ermitteln
IHeight = ImageHeight(#EtikettImage)                 ; Bildhöhe ermitteln
Ratio.f = IWidth/IHeight                                     ; Seitenverhältnis ermitteln
ResizeImage(#EtikettImage,295,295/Ratio)           ; Bild mit korrektem Seitenverältnis darstellen
SetGadgetState(#Image_Etikett,ImageID(#EtikettImage))     ; Bild in ImageGadget schreiben

SetDatabaseBlob(#Database,0,Etikett\Buffer,Etikett\Size)     ; Blob Information schreiben
DatabaseQuery(#Database,"UPDATE Produkte SET Etikett1=? WHERE ID=1") ; Blob in Datenbank schreiben

FreeMemory(Etikett\Buffer)                                ; Speicher wieder freigeben.
Und jetzt wollte ich wieder wie folgt auslesen:

Code: Alles auswählen

DatabaseQuery(#Database,"SELECT * FROM Produkte WHERE ProdID=1")         ;Richtigen Datensatz herausfischen
NextDatabaseRow(#Database)                                                                 
With Etikett                                                                                          ; etwas für Schreibfaule
    intTMP = GetDatabaseBlob(#Database,39,\Buffer,\Size)                                ; Blob aus DB auslesen
    If intTMP > 0 And \Buffer > 0 And \Size > 0                                                ; Nur wenn erfolgreich gelesen weiter
         CatchImage(#EtikettImage,\Buffer)                                                       ; Bild aus Speicher lesen
         IWidth = ImageWidth(#EtikettImage)                                                     ; Bildbreite ermitteln
         IHeight = ImageHeight(#EtikettImage)                                                   ; Bildhöhe ermitteln
         Ratio.f = IWidth/IHeight                                                                       ; Seitenverhältnis ermitteln
         ResizeImage(#EtikettImage,295,295/Ratio)                                             ; Bild im korrekten Seitenverhältnis darstellen
         SetGadgetState(#Image_Etikett,ImageID(#EtikettImage))                         ; Bild ins Image Gadget schreiben
         FreeMemory(\Buffer)                                                                          ; Speicher wieder freigeben
     EndIf
EndWith
Beim prüfen der intTMP variablen gibt diese eine 1 aus, also wurde der BLOB erfolgreich erkannt (geladen?)
Etikett\Buffer = 0
Etikett\Size = 0 (wohl doch nicht erfolgreich geladen !?)

Im Moment sehe ich nicht wo ich etwas falsch gemacht haben könnte.

Hat jemand eine Idee ?

Vielen Dank schon einmal für hilfreiche Kommentare

Re: Problem mit GetDatabaseBlob

Verfasst: 08.10.2012 22:43
von ts-soft
Ich denke mal, Du hast den Buffer nicht allokiert.
Ansonsten siehe hier: http://www.purebasic.fr/german/viewtopi ... 89#p293989

Gruß
Thomas

Re: Problem mit GetDatabaseBlob

Verfasst: 08.10.2012 22:53
von MenschMarkus
Hallo Thomas,

in der Tat, habe gemäß Deinem Link den Speicher allokiert und schon geht's.

Danke für die schnelle Hilfe

Gruß Markus

P.S Man sollte öfter mal ne Pause einlegen. Irgendwan ist man Blind.