Seite 2 von 4

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 13:13
von Velindos
Hallo,
bin schon beim sauber machen. Spass bei Seite, du hast recht, aber wie es so ist, bin ich ein alter Hacker in diesen Sachen.
Werde deine Vorschläge, im Ernst in das Programm einarbeiten. Möchte jedoch vorher einige wichtige Merkmale abchecken. Mit unter ist in deinem Vorschlag das Bild verschwunden.
Nun habe ich mich mit dem auseinander gesetz und mich in kleinen Schritten genähert, was zur Folge hat, dass ich bei der Fehlermeldung „Ungültiger Speicherzugriff“ geladet bin.

Hier der Code mit der notierten Fehlermeldung

Code: Alles auswählen

Procedure DatenbankAnzeigen()
  #DatenFILE=0
  a=0
  Debug DatabaseFile$
  If OpenDatabase(#DatenFILE, DatabaseFile$, "", "",#PB_Database_SQLite    )
    If DatabaseQuery(#DatenFILE, "SELECT * FROM Notiz") 
      
      While NextDatabaseRow(#DatenFILE)   ; alle Einträge durchlaufen
        

        
        
        
        ID$(a)=GetDatabaseString(0,0)     ; GetDataBaseBlob () 
        StringGadget(#String_ID, 200, 105, 30, 20, ID$(a))
        Stichwort$(a)=GetDatabaseString(0,1)
        StringGadget(#String_Stichwort, 195, 135, 255, 20, Stichwort$(a))
        Notiz$(a)= GetDatabaseString(0,2)
        StringGadget(#String_Notiz, 195, 170, 255, 20,        Notiz$(a))
        Pfad$(a)= GetDatabaseString(0,3)
        StringGadget(#String_Pfad, 195, 385, 255, 20, Pfad$(a))
        
        Bild = DatabaseColumnType(#DatenFILE, 4)
        result=NextDatabaseRow(#DatenFILE)
        Debug "ROW =" +Str(result)
        picsize = DatabaseColumnSize(#DatenFILE,4)
        Debug "Schau aufs Image"
        result = GetDatabaseBlob(#DatenFILE,4,*blobreadpuffer, picsize); Warum ungültiger Speicherzugriff
        Debug "*- GOT BLOB Status ="+Str(result)
        BLOB: CatchImage(#PB_Any, *blobreadpuffer)
        ImageGadget(#Image_Bild, 195, 220, 255, 155, BLOB, #PB_Image_Border)
        
      ;#BildZeiger = GetDatabaseBlob (#DatenFILE,4)
        Debug "Start der Anzeige des Bildes"
        Debug Bild
        Debug Ergebnis
        Debug BildZeiger
        ;Bild= GetDatabaseBlob (#DatenFILE,4)
        
        Debug a
        Debug ID$(a)
        Debug Stichwort$(a)
        Debug Notiz$(a)
        Debug Pfad$(a)
        a=a+1
        Debug a
        
      Wend
    EndIf
    
    FinishDatabaseQuery(#DatenFILE)
  EndIf
EndProcedure  
Verzeih mit meine alte Procedure, möchte aber das Bild in meinem Imagegadet sehen.
Kannst du mir helfen?

Gruss … Velindos

PS: Etwas zur Unterhaltung http://www.youtube.com/watch?v=VBdSqk78nHw

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 13:29
von Kiffi
bevor ich mich an Deinen Code setze: Hast Du das Bild
denn auch als Blob in die Datenbank gespeichert?

Grüße ... Kiffi

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 14:13
von Velindos
Hallo,
habe ich über den SQL-Administrator gemacht! Kann es auch bearbeiten mit dem SQL-Administrator!
Sprich, das läuft. Zur Zeit habe ich drei Einträge, mit Notiz1...3 bis drei Image´s.

Gruss ... Velindos

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 15:00
von Kiffi
probier mal folgenden Code aus:

Code: Alles auswählen

Procedure DatenbankAnzeigen()
  #DatenFILE=0
  a=0
  Debug DatabaseFile$
  If OpenDatabase(#DatenFILE, DatabaseFile$, "", "",#PB_Database_SQLite    )
    If DatabaseQuery(#DatenFILE, "SELECT * FROM Notiz") 
      
      While NextDatabaseRow(#DatenFILE)   ; alle Einträge durchlaufen
        
        ID$(a)=GetDatabaseString(0,0)     ; GetDataBaseBlob () 
        StringGadget(#String_ID, 200, 105, 30, 20, ID$(a))
        Stichwort$(a)=GetDatabaseString(0,1)
        StringGadget(#String_Stichwort, 195, 135, 255, 20, Stichwort$(a))
        Notiz$(a)= GetDatabaseString(0,2)
        StringGadget(#String_Notiz, 195, 170, 255, 20,        Notiz$(a))
        Pfad$(a)= GetDatabaseString(0,3)
        StringGadget(#String_Pfad, 195, 385, 255, 20, Pfad$(a))
        
        ; Anfang Testcode
        If DatabaseColumnType(#DatenFILE, 4) = #PB_Database_Blob 
          picsize = DatabaseColumnSize(#DatenFILE,4)
          If picsize
            *blobreadpuffer = AllocateMemory(picsize)
            If *blobreadpuffer
              If GetDatabaseBlob(#DatenFILE, 4, *blobreadpuffer, picsize)
                Debug "GetDatabaseBlob erfolgreich durchgeführt"
              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(#DatenFILE, 4) ist kein Blob"
        EndIf
        ; Ende Testcode
        
        Debug a
        Debug ID$(a)
        Debug Stichwort$(a)
        Debug Notiz$(a)
        Debug Pfad$(a)
        a=a+1
        Debug a
        
      Wend
    EndIf
    
    FinishDatabaseQuery(#DatenFILE)
  EndIf
EndProcedure
und schreib dann, welche Debug-Ausgaben gemacht werden.

Grüße ... Kiffi

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 15:32
von Velindos
Hallo,
läuft durch und zeigt folgende Meldungen in der Debugger-Ausgabe an:
DS Aktualisieren
C:/Database3.db
GetDatabaseBlob erfolgreich durchgeführt
0
1
1.Notiz

Erste Notiz
C:\
1
GetDatabaseBlob erfolgreich durchgeführt
1
2
2.Notiz
Zweite Notiz
D:\
2
GetDatabaseBlob erfolgreich durchgeführt
2
3
3.Notiz
Dritte Notiz
E:\
3
Gruss ... Velindos

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 15:41
von Kiffi
Velindos hat geschrieben:
GetDatabaseBlob erfolgreich durchgeführt
na, das ist doch schon mal was! :-)

OK, jetzt kannst Du in genau dieser Zeile Dein Image 'catchen' und
in Dein ImageGadget laden. Nicht vergessen, entsprechende Image-
Decoder in Deinen Source einzubinden (UsePNGImageDecoder(),
UseJPEG...(), etc.)

Nochmal zur Erinnerung: Wenn das klappt, dann solltest Du auf jeden Fall
das Erstellen der Gadgets aus der While-Wend Schleife auslagern.

Grüße ... Kiffi

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 16:33
von Velindos
Hallo,
habe wie gesagt die UsePNGImageDecoder() & UseJPEGImageDecoder() eingefügt, jedoch wird das Image nicht geladen, oder ist nicht sichtbar.

Code: Alles auswählen

Procedure DatenbankAnzeigen()
  #DatenFILE=0
  a=0
  Debug DatabaseFile$
  If OpenDatabase(#DatenFILE, DatabaseFile$, "", "",#PB_Database_SQLite    )
    If DatabaseQuery(#DatenFILE, "SELECT * FROM Notiz")
      
      While NextDatabaseRow(#DatenFILE)   ; alle Einträge durchlaufen
        
        ID$(a)=GetDatabaseString(0,0)     ; GetDataBaseBlob ()
        StringGadget(#String_ID, 200, 105, 30, 20, ID$(a))
        Stichwort$(a)=GetDatabaseString(0,1)
        StringGadget(#String_Stichwort, 195, 135, 255, 20, Stichwort$(a))
        Notiz$(a)= GetDatabaseString(0,2)
        StringGadget(#String_Notiz, 195, 170, 255, 20,        Notiz$(a))
        Pfad$(a)= GetDatabaseString(0,3)
        StringGadget(#String_Pfad, 195, 385, 255, 20, Pfad$(a))
        
        ; Anfang Testcode
        If DatabaseColumnType(#DatenFILE, 4) = #PB_Database_Blob
          picsize = DatabaseColumnSize(#DatenFILE,4)
          If picsize
            *blobreadpuffer = AllocateMemory(picsize)
            If *blobreadpuffer
              If GetDatabaseBlob(#DatenFILE, 4, *blobreadpuffer, picsize)
                Debug "GetDatabaseBlob erfolgreich durchgeführt"
              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(#DatenFILE, 4) ist kein Blob"
        EndIf
        ; Ende Testcode
        
        BLOB(a): CatchImage(1, *blobreadpuffer)
        ImageGadget(#Image_Bild, 195, 220, 255, 155, BLOB(a), #PB_Image_Border)
        
        Debug a
        Debug ID$(a)
        Debug Stichwort$(a)
        Debug Notiz$(a)
        Debug Pfad$(a)
        a=a+1
        Debug a
        Debug "DatenbankAnzeigen durchlaufen"
      Wend
    EndIf
    
    FinishDatabaseQuery(#DatenFILE)
  EndIf
EndProcedure
Gruss ... Velindos

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 16:36
von Kiffi
Velindos hat geschrieben:

Code: Alles auswählen

BLOB(a): CatchImage(1, *blobreadpuffer)
wie wäre es mit

Code: Alles auswählen

BLOB(a) = CatchImage(1, *blobreadpuffer)
?

Und wie geschrieben: Die Zuweisung solltest Du nur durchführen,
wenn GetDatabaseBlob() auch wirklich geklappt hat.

Grüße ... Kiffi

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 17:07
von Velindos
Hallo,
danke für deinen Tip!

Mir fehlt jetz aber letztlich der Faden. Habe jetzt die Sache mit

BLOB(a)= CatchImage(1, *blobreadpuffer)
ImageGadget(#Image_Bild, 195, 220, 255, 155, BLOB(a), #PB_Image_Border)

Getest und funkt nicht!!!!!!!!!

Dann habe ich einen einzelnen Datensatz programmiert und funkt wieder nicht.

BLOB( = CatchImage(0, *blobreadpuffer)
ImageGadget(#Image_Bild, 195, 220, 255, 155, BLOB, #PB_Image_Border)

Ich sehe einfach kein Bild, obwohl die einzelnen Daten der Datenbank angezeigt werden.

Gruss … Velindos

Re: SQLite und die SELECT Abfrage

Verfasst: 01.12.2010 18:25
von Kiffi
Velindos hat geschrieben:Getest und funkt nicht!!!!!!!!!
dieser Testcode hier 'funkt':

Code: Alles auswählen

UseSQLiteDatabase()

; quick'n dirty eine kleine testdatenbank zusammenschrauben:
OpenDatabase(0, ":memory:", "", "", #PB_Database_SQLite)
DatabaseUpdate(0, "Create Table myTable (myBlob BLOB)")
ReadFile(0, #PB_Compiler_Home + "Examples\Sources\Data\AlphaChannel.bmp")
Buffersize = Lof(0)
Buffer = AllocateMemory(Buffersize)
ReadData(0, Buffer, Buffersize)
CloseFile(0)
SetDatabaseBlob(DB, 0, Buffer, Buffersize)
DatabaseUpdate(DB, "Insert Into myTable (myBlob) Values (?);")
DatabaseQuery(0, "Select * From myTable")
NextDatabaseRow(0)

; hier auslesen:
If DatabaseColumnType(0, 0) = #PB_Database_Blob 
  picsize = DatabaseColumnSize(0, 0)
  If picsize
    *blobreadpuffer = AllocateMemory(picsize)
    If *blobreadpuffer
      If GetDatabaseBlob(0, 0, *blobreadpuffer, picsize)
        myImage = CatchImage(0, *blobreadpuffer)
      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(0, 0) ist kein Blob"
EndIf

If myImage = 0
  End
EndIf

If OpenWindow(0, 0, 0, 220, 120, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ImageGadget(0,  10, 10, 0, 0, myImage)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Vergleich das mal in den Grundzügen mit Deinem Code. Vielleicht erkennste
ja den Fehler bei Dir. Ansonsten kann ich wenig dazu sagen.

Grüße ... Kiffi