Seite 1 von 2

Bild in SQlite speichern

Verfasst: 04.02.2013 16:31
von gnaps
Hallo Leute,

ich fummle schon eine ganze Weile mit einer SQlite-Datenbank herum.

Dank TS-Soft und seinem "SQLite3 - Tutorial für Einsteiger" bin ich auch schon weit gekommen.

Ich benötige für mein Projekt auch eine Adressdatenbank, hier möchte ich auch ein Bild zur
Adresse abspeichern, Das laden zuschneiden und übergeben an ein ButtonGadget geht auch.

Hier der Code

Code: Alles auswählen

AdresseBild.s = OpenFileRequester("Bilddatei laden", "", "Bild (*.png,*.jpg,*.gif)|*.png;*.jpg;*.gif", 0) ;FileRequaster für Bildauswahl
            If LoadImage(2000,AdresseBild.s) ;Wenn ein Bild dann Lade es
              x.i=ImageWidth(2000) ;Breite des Bildes ermitteln
              y.i=ImageHeight(2000) ; Höhe des Bildes ermitteln
              If x.i > 250 Or y.i > 250  ;wenn die Bildbreite größer als die Bildhöhe ist
                If x.i>y.i ; ist die Bildbreite größer als die höhe
                  proportional.f=(x.i/250) ;berechne den Proportional-Faktor
                  x.i=(x.i/proportional.f) ;berechne die neue Breite
                  y.i=(y.i/proportional.f) ;berechen die neue Höhe
                  ResizeImage(2000,x.i,y.i) ;ändere die Bildgröße
                ElseIf y.i>x.i ; wenn die Bildhöhe größer als die Bildbreite ist
                  proportional.f=(y.i/250) ;berechne den Proportional-Faktor
                  x.i=(x.i/proportional.f) ;berechne die neue Breite
                  y.i=(y.i/proportional.f) ;berechne die neue Höhe
                  ResizeImage(2000,x.i,y.i) ;ändere die Bildgröße
                Else
                  ResizeImage(2000,250,250) ;ändere die Bildgröße wenn die Bildbreite und Bildhöhe gleich ist
                EndIf
              EndIf 
              SetGadgetState(#gad_strAdresseBild,ImageID(2000)) ;übergebe das Bild an das Gadget
So jetzt kommts,
wie bekomme ich das Bild jetzt in die Datenbank gespeichert?

Meine Tabelle hat folgende Tables

Code: Alles auswählen

  SQLAdressenCreate.s = "CREATE TABLE adressen (id INTEGER PRIMARY KEY AUTOINCREMENT,"
  SQLAdressenCreate.s + " nachname TEXT, vorname TEXT, zusatz TEXT, anrede TEXT, strasseprivat TEXT, plzprivat INTEGER, ortprivat TEXT,"
  SQLAdressenCreate.s + " strassegeschaeft TEXT, plzgeschaeft INTEGER, ortgeschaeft TEXT,telefonprivat TEXT, telefongeschaeft TEXT,"
  SQLAdressenCreate.s + " mobil TEXT, fax TEXT, emailprivat TEXT, emailgeschaeft TEXT, inet TEXT, briefanrede TXT, bild BLOB,"
  SQLAdressenCreate.s + " gewerke TEXT, Freifeld1 TEXT, Freifeld2 TEXT, Freifeld3 TEXT)"
Die Spalte "bild BLOB" ist für die Bilder angelegt, nur wie bekomme ich das da hin ?
Hier hänge ich

Code: Alles auswählen

If ReadFile (0,AdresseBild.s)
    size = Lof(0) 
    If size
      *mem = AllocateMemory(size)
      If *mem
        ReadData(0, *mem, size)
        SetDatabaseBlob(#ProjektDB, 0, *mem, size)
        sql = "INSERT INTO adressen (AdresseBild.s, bild) VALUES ('"
        sql + AdresseBild.s + "', ?)"
        DatabaseUpdate(#ProjektDB, sql)
      EndIf
      Debug size
      Debug *mem
    EndIf
  EndIf

Für eine Hilfestellung wäre ich echt dankbar.

Gruß
gnaps

Re: Bild in SQlite speichern

Verfasst: 04.02.2013 18:12
von Kiffi

Code: Alles auswählen

sql = "INSERT INTO adressen (AdresseBild.s, bild) VALUES ('"
        sql + AdresseBild.s + "', ?)"
ich nehme mal an, dass Du den Namen der Bilddatei nicht in die Datenbank speichern willst, oder?

Grüße ... Kiffi

Re: Bild in SQlite speichern

Verfasst: 04.02.2013 19:37
von gnaps
Hallo Kiffi,

nein, nicht den Namen sodern das Bild.
Hier liegt ja mein Problem.

Gruß
gnaps

Re: Bild in SQlite speichern

Verfasst: 04.02.2013 20:04
von Kiffi
gnaps hat geschrieben:nein, nicht den Namen sodern das Bild.
ich dachte, ich hätte mit meinem Hinweis heftig genug mit
dem Zaunpfahl gewedelt ;-)

Schau Dir bitte mal Dein Insert-Statement an:

Code: Alles auswählen

sql = "INSERT INTO adressen (AdresseBild.s, bild) VALUES ('"
sql + AdresseBild.s + "', ?)"
sieht dann so aus:

Code: Alles auswählen

INSERT INTO adressen (AdresseBild.s, bild) VALUES ('c:\meinbild.png', ?)
Klingelt's jetzt? :-)

Grüße ... Kiffi

Re: Bild in SQlite speichern

Verfasst: 04.02.2013 22:47
von STARGÅTE
Nein Kiffi daran liegt es nicht. Das Bild wird ja über das ? gespeichert.

Das Problem ist hier, dass gnaps beim SpaltenNamen ein .s angehägt hat, deswegen gibt das ein SQL-Syntaxerror.
Das nächste mal also bitte Den Error abfragen, der von der Datenbank zurückgegeben wird.

Ich sehe bei "CREATE TABLE" auch kein Feld namens AdresseBild, daher:
So sollte es gehen:

Code: Alles auswählen

SetDatabaseBlob(#ProjektDB, 0, *mem, size)
DatabaseUpdate(#ProjektDB, "INSERT INTO adressen (bild) VALUES (?)")

Re: Bild in SQlite speichern

Verfasst: 04.02.2013 23:33
von Kiffi
@STARGÅTE: Gut erkannt. Genau darauf wollte ich hinaus und
gnaps einen Schubs in die richtige Richtung geben. :-)

Grüße ... Kiffi

Re: Bild in SQlite speichern

Verfasst: 05.02.2013 00:16
von gnaps
Hi Leute,

bin am verzweifeln,

habe jetzt

Code: Alles auswählen

DatabaseUpdate(#ProjektDB, "INSERT INTO adressen (bild) VALUES (?)")
und kein Bild in der DB, jedenfals wenn ich mit SQLite Administrator reinschaue.

Ich lege mich jetzt ab und schlafe nix, weil das nett geht.

gruß
gnaps

Re: Bild in SQlite speichern

Verfasst: 05.02.2013 00:25
von Kiffi
DB-Tools zeigen BLOBs in den seltensten Fällen korrekt an.

(siehe auch hier: http://www.purebasic.fr/german/viewtopi ... 05#p308605)

Grüße ... Kiffi

Re: Bild in SQlite speichern

Verfasst: 05.02.2013 00:59
von Sunny
Wäre es nicht möglich den Inhalt des Bildes auszulesen, diesen dann mit Base64Encoder() zu Codieren und dann als String abzuspeichern? Dann dürften doch eigentlich auch keine Fehler auftreten.

Re: Bild in SQlite speichern

Verfasst: 05.02.2013 01:15
von Kiffi
Sunny hat geschrieben:Wäre es nicht möglich den Inhalt des Bildes auszulesen, diesen dann mit Base64Encoder() zu Codieren und dann als String abzuspeichern?
doch, aber damit erkauft man sich aber zwei Nachteile:

* Kodieren und Dekodieren dauert seine Zeit
* Ein Bild belegt den doppelten Speicherplatz in der DB
Sunny hat geschrieben:Dann dürften doch eigentlich auch keine Fehler auftreten.
naja, der Fehler, den gnaps gemacht hat, ist ja schon lokalisiert.
Wenn man es richtig macht, dann klappt es auch mit BLOBs :-)

Grüße ... Kiffi