SQLite und die SELECT Abfrage

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite und die SELECT Abfrage

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite und die SELECT Abfrage

Beitrag von Kiffi »

bevor ich mich an Deinen Code setze: Hast Du das Bild
denn auch als Blob in die Datenbank gespeichert?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite und die SELECT Abfrage

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite und die SELECT Abfrage

Beitrag 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
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite und die SELECT Abfrage

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite und die SELECT Abfrage

Beitrag 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
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite und die SELECT Abfrage

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite und die SELECT Abfrage

Beitrag 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
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: SQLite und die SELECT Abfrage

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SQLite und die SELECT Abfrage

Beitrag 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
a²+b²=mc²
Antworten