Seite 3 von 4

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 18:41
von Velindos
Hallo Kiffi,
du bist ein Typ, werde morgen das einarbeiten und bescheid sagen.
War heute schon so weit das ich aufgeben wollte, hast du verhindert!!!
Schönen Abend noch,
gruss ... Velindos

Re: SQLite und die SELECT Abfrage

Verfasst: 02.12.2010 09:49
von Velindos
Hallo,
Danke für die Source “Virtuelle SQLite”. Habe die Source ins Programm eingearbeitet und habe folgende Debugger Meldungen, jedoch „kein BILD“.

Code: Alles auswählen

Procedure ErstenDatensatzLesen()
  
  
  Protected DB
  
  DB = OpenDatabase(#PB_Any, DatabaseFile$, "", "",#PB_Database_SQLite)
  If DB
    ;If DatabaseQuery(DB, "SELECT * FROM Notiz WHERE ID=) 
    If DatabaseQuery(DB, "SELECT * FROM Notiz WHERE ID = " + Aktuell_Zeiger$ )
      NextDatabaseRow(DB) ; Erster Datensatz
      
      Debug "Aktueller_Zieger: "+Str(Aktuell_Zeiger)
      Aktuell_ID$= GetDatabaseString(DB,0)
      Aktuell_Stichwort$= GetDatabaseString(DB,1)
      Aktuell_Notiz$= GetDatabaseString(DB,2)
      Aktuell_Pfad$ = GetDatabaseString(DB,3)
      
      ; Anfang Testcode
      If DatabaseColumnType(DB, 4) = #PB_Database_Blob;Typ eines Feldes
        picsize = DatabaseColumnSize(DB,4) ;Größe des Blob 
        If picsize                         ;Größe des Blob 
          *blobreadpuffer = AllocateMemory(picsize) ;Zeiger auf Blob
          If *blobreadpuffer                        ;unklar weil keine Bedingung
              Debug "BLOBreadpuffer= "+Str(*blobreadpuffer)+" picsize= "+Str(picsize)
            If GetDatabaseBlob(DB, 4, *blobreadpuffer, picsize) ;Zeiger auf den Blob-Speicher 
              result = GetDatabaseBlob(DB, 4, *blobreadpuffer, picsize) ;Zeiger Blob-Speicher 
              Debug "BLOB Status ="+Str(result)
              MyImage = CatchImage(#PB_Any,*blobreadpuffer) ;Lädt das angegebene Bild von result
              Debug "MyImage= "+Str(MyImage)+" #PB_Any="+Str(#PB_Any)
            Else
              Debug "GetDatabaseBlob ist fehlgeschlagen"
            EndIf
            FreeMemory(*blobreadpuffer)
          Else
            Debug "Nicht genügend Speicher vorhanden"
          EndIf
        Else
          Debug "picsize is null"
        EndIf
      Else
        Debug "DatabaseColumnType(DB, 4) ist kein Blob"
      EndIf
      ; Ende Testcode
      
      FinishDatabaseQuery(DB)
    EndIf
    CloseDatabase(DB)
  EndIf
  
EndProcedure
Debugger:
DS anfang
Aktueller_Zieger: 1
BLOBreadpuffer= 94306432 picsize= 389624
BLOB Status =1
MyImage= 0 #PB_Any=-1
MyImage Hauptschleife= 0
Was kann man noch tun um ein Bild zu sehen? Ansonsten fehlen mit die Worte(Befehle)!

Gruss .. Velindos

Re: SQLite und die SELECT Abfrage

Verfasst: 02.12.2010 10:09
von Kiffi
pack mal den ganzen Kram als ZIP zusammen und lade den
hier hoch: http://hosting.alexander-n.de/.

Danach postest Du hier den URL.

Grüße ... Kiffi

Re: SQLite und die SELECT Abfrage

Verfasst: 02.12.2010 10:26
von Velindos
Hallo,
habe den Kram zusammengepackt. Der aktuelle Test läuft über den Aufruf „ErstenDatensatzLesen“
somit über die Taste „Erster Datensatz = |< „

Sendung an Kiffi
http://hosting.alexander-n.de/=NDg3LjEyOTEyNzgxNjE=

Gruss … Velindos

Re: SQLite und die SELECT Abfrage

Verfasst: 02.12.2010 12:56
von Kiffi
ok, habe ein bisschen herumprobieren müssen.

1.) Deine Datenbank ist defekt. Im Feld 'Bild' ist alles andere; nur keine
validen Bilddaten. Kann es sein, dass Du die Bilder in die Datenbank eingefügt
hast und erst nachträglich den Datentyp des Feldes auf BLOB gestellt hast?

Du solltest die Tabelle neu erstellen. Ab besten direkt in PB. Den entsprechenden
Code hast Du ja.

2.) Wenn Du bei CatchImage #PB_Any verwendest, musst Du das
Bild mit ImageID(MyImage) angeben.

Code: Alles auswählen

MyImage = CatchImage(#PB_Any,*blobreadpuffer)
SetGadgetState(#Image_Bild, ImageID(MyImage))
Wenn Du eine Zahl anstelle von #PB_Any verwendest, kannst Du
das Bild direkt mit MyImage angeben:

Code: Alles auswählen

MyImage = CatchImage(0,*blobreadpuffer)
SetGadgetState(#Image_Bild, MyImage)
Grüße ... Kiffi

Re: SQLite und die SELECT Abfrage

Verfasst: 02.12.2010 15:02
von Velindos
Hallo,

Versuche mit PureBasic die Datenbank mit Bilder zu laden, wie folgt:

DataSection
pic1:
IncludeBinary "C:\Versuch.bmp"
endpic1:
SmallPicture:
IncludeBinary "C:\pede.bmp"
endSmallPicture:
EndDataSection

pic1 = CatchImage(0, ?pic1)
SmallPicture = CatchImage(0, ?SmallPicture)

Code: Alles auswählen

Procedure InsertBild()
  If OpenDatabase(0, DatabaseFile$, "", "",#PB_Database_SQLite    )
    CheckDatabaseUpdate(0,"CREATE TABLE PHOTOS(picture BLOB, name VARCHAR ,small_picture)")
    Debug "Datenbase= "+DatabaseFile$
    SetDatabaseBlob(0,0,?pic1, (?endpic1 - ?pic1))
    SetDatabaseBlob(0,1,?SmallPicture, (?endSmallPicture - ?SmallPicture))
    DatabaseUpdate(0, "INSERT INTO PHOTOS (picture, name, small_picture) values (?, 'my description', ?);")
    If DatabaseQuery(0, "SELECT * FROM Photos")
      While NextDatabaseRow(0)
        Debug GetDatabaseString(0, 0)
      Wend
      FinishDatabaseQuery(0)
    EndIf
    CloseDatabase(0)
  Else
    Debug "Can't open database !"
  EndIf
EndProcedure
Obwohl der Datensatz in der SQLite angehängt wird, habe ich keine Bilder?

Gruss ... Veldindos

Re: SQLite und die SELECT Abfrage

Verfasst: 03.12.2010 12:23
von Velindos
Hallo,
das mit den Bilder in die Datenbank und aus der Datenbank läuft. Du hattest recht dürfte an der Datenbank gelegen sein!
Nun möchte ich noch mein Bild das ich per Drop in mein Gadget eingefügt habe so aufbereiten das ich es der Datenbank übergeben kann:

ImageGadget(0, 30, 30, 220, 210, Image0)
????
SetDabaseBlob(1,0, ?Image0, ?endImage0 - ?Image0)

Hier fehlt mir der Durchblick wie ich auf die Werte Buffer(Image0), und Buffersize( ?endImage0 - ?Image0) komme.

Nochmals besten Dank für deine Unterstützung, dies ist prima!!! Bei mir funkt es nicht immer gleich!

Gruss ... Velindos

Re: SQLite und die SELECT Abfrage

Verfasst: 03.12.2010 12:47
von Kiffi
Velindos hat geschrieben:Nun möchte ich noch mein Bild das ich per Drop in mein Gadget eingefügt habe so aufbereiten das ich es der Datenbank übergeben kann:
wenn Du ein Bild auf Dein ImageGadget droppst, dann hast Du
ja schon einmal den Dateinamen. Mit FileSize(Bildname) kannst
Du die Größe ermitteln. Dann führst Du ein LoadImage(Bildname)
aus. Und somit hat Du alle Informationen, die Du für
SetDatabaseBlob() benötigst.

Vergiss das mit dem CatchImage() auf '?' - Pointer. Das ist nur
für Bilder, die mit IncludeBinary bereits in Deiner Exe eingebunden
wurden.

Grüße ... Kiffi

Re: SQLite und die SELECT Abfrage

Verfasst: 05.12.2010 13:02
von SirMatti74
Ist zwar zum jetzigen Zeitpunkt eher zweitrangig aber ich möchte von der Verwendung von "SELECT * FROM tbl" ohne WHERE-Bedingung abraten. So wie ich das verstehe möchtest Du sowieso nur einen Datensatz in einem Formular anzeigen und keine gleichzeitige Übersicht über mehrere Datensätze (sprich Tabelle). In so einem Fall ist meine Empfehlung, mit einer ersten Abfrage nur den Index zu lesen

Code: Alles auswählen

"SELECT id FROM notiz"
die Werte in einem Array abzulegen, beim Vor- und Zurückspringen dem entsprechend (Index-)Wert aus dem Array zu holen und damit den dazugehörigen Datensatz bzw. sogar nur die gerade benötigten Felder mit

Code: Alles auswählen

"SELECT * FROM notiz WHERE id=[gesuchte ID]"

bzw.

"SELECT stichwort, notiz, pfad, bild FROM notiz WHERE id=[gesuchte ID]"
sich aus der DB geben zu lassen. Es mindert die Menge an Daten die Du von der Datenbank abrufst, somit die Last auf der Datenbank, auf dem Speicherverbrauch und ggf. auch auf dem Netzwerk (und die kann insbesondere durch die Bilddaten mit steigender Datensatzanzahl enorm werden). Als Nebeneffekt kannst Du die zurückgegebenen Daten mehr oder minder direkt in die einzelnen Gadgets lesen und ersparst Dir die ganze Verwaltung der Daten per Array und LinkedList (das kann jede SQL-DB sowieso besser :wink: ).

Die Optimierung könnten wir noch weiter voran treiben und ohne vorheriges Auslesen der Index-Werte durch die Tabelle springen und wäre zumindest bei Multi-User-DB-Betrieb das Mittel der Wahl, um stets auf dem aktuellen Datenbestand herum zu reiten :allright: (gibt da sicherlich noch weitere Möglichkeiten):

Code: Alles auswählen

//Rückwärts
"SELECT id, stichwort, notiz, pfad, bild FROM notiz WHERE id = (SELECT max(id) FROM notiz WHERE id < [aktuelle ID])"
//Vorwärts
"SELECT id, stichwort, notiz, pfad, bild FROM notiz WHERE id = (SELECT min(id) FROM notiz WHERE id > [aktuelle ID])"

Re: SQLite und die SELECT Abfrage

Verfasst: 06.12.2010 11:39
von Velindos
Hallo,
danke für euren Tip, werde mich mit diesem noch eingehend beschäftigen!

Versuche gerade Kiffis Anweisung zu meinen Bild(MeinImage3) zu kommen, wenn ich es gedropt habe.

Code: Alles auswählen

ElseIf EventID = #PB_Event_GadgetDrop
    Select EventGadget()
          Case #Image2
            If EventDropImage(#TargetImage)
              SetGadgetState(#Image2, ImageID(#TargetImage))
              MeinImage3 = CatchImage(MeinImage3, ImageID(#Image2))
              ;SaveImage(#Image2, GetTemporaryDirectory()+"redbox.bmp")
              ;CatchImage(MyImage,ImageID(#Image2))
              ;SetGadgetState(#Image_Bild, MyImage)
              
              
              ;SetGadgetState(#Image2, ImageID(#TargetImage))
              ;MeinImage3 = CatchImage(#PB_Any, #Image2)
              
              ;MeinImage3=CopyImage(#Image2,#PB_Any)
              ;Image3 = CatchImage(#PB_Any, #Image2)
                       
              ;Image3 = CatchImage (Image3,#Image2) 
              ;ImageGadget(5,20,100,180,180,Image3,#PB_Image_Border)
            EndIf
        EndSelect    
Habe mal meine Versuche herein gegebe. Das Problem was ich habe ist das ich ständig die Meldung "#Image ist nicht initialisiert" bekomme. Habe den Faden komplett verloren:
1. Schritt: Image auf ImageGadget ziehen.
2. Schritt: EventDropImage wird ausgelöst und mit SetGagdet auf Image#2 gesezt.
3. Schritt: Catchimage auf MeinImage3, aber wie ???

Gruss ... Velindos