Access Blob und Gifs Binär

Anfängerfragen zum Programmieren mit PureBasic.
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Access Blob und Gifs Binär

Beitrag von TheSaint »

Hallo Zusammen,

in einer Access Datenbank habe ich unter anderem Bilder gespeichert, und zwar mit einer Function: ReadBlob()
Diese Funktion liest ein BLOB aus einem Verzeichnis und speichert es in einem Access Tabellenfeld.

Mit einer anderen Funktion speichere ich animierte Gifs in die Access Datenbank:
RS("tbl_AG01_BildObjekt").AppendChunk arrBin() 'Binär speichern

Meine Frage geht dahin, ob ich mit PB die Möglichkeit habe diese Bilder und Gifs aus der Access Datenbank aufzurufen und in ein Gadget anzuzeigen?
Wäre toll wenn mir jemand helfen könnte.

Schon mal vielen Dank dafür.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Access Blob und Gifs Binär

Beitrag von Kiffi »

TheSaint hat geschrieben:ReadBlob()
Ist das eine native MS-Access-Funktion?

Grüße ... Kiffi
a²+b²=mc²
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Re: Access Blob und Gifs Binär

Beitrag von TheSaint »

Hallo Kiffi,
Kiffi hat geschrieben:
TheSaint hat geschrieben:ReadBlob()
Ist das eine native MS-Access-Funktion?
Hm, sorry, kann leider nichts im moment mit dem Begriff native anfangen.
Hier ist der Code aus Access den ich zum speichern benutze:

Code: Alles auswählen

Function ReadBLOBNeu(Source As String, T As Recordset, sField As String)
    
'**************************************************************
' FUNCTION: ReadBLOB()      '      ' PURPOSE:
'   Reads a BLOB from a disk file and stores the contents in the
'   specified table and field.      '      ' PREREQUISITES:
'   The specified table with the OLE object field to contain the
'   binary data must be opened in Visual Basic code (Access Basic
'   code in Microsoft Access 2.0 and earlier) and the correct record
'   navigated to prior to calling the ReadBLOB() function.      '
' ARGUMENTS:
'   Source - The path and filename of the binary information
'            to be read and stored.
'   T      - The table object to store the data in.
'   Field  - The OLE object field in table T to store the data in.      '
' RETURN:      '   The number of bytes read from the Source file.
'**************************************************************
    
    Dim NumBlocks As Integer, SourceFile As Integer, I As Integer
'    Dim FileLength As Long
    Dim LeftOver As Long
    Dim FileData As String
    Dim RetVal As Variant
'          On Error GoTo Err_ReadBLOB
    ' Open the source file.
    SourceFile = FreeFile
    Open Source For Binary Access Read As SourceFile
    ' Get the length of the file.
    FileLength = LOF(SourceFile)
    If FileLength = 0 Then
        ReadBLOBNeu = 0
        Exit Function
    End If
    ' Calculate the number of blocks to read and leftover bytes.
    NumBlocks = FileLength \ BlockSize
    LeftOver = FileLength Mod BlockSize
    ' SysCmd is used to manipulate status bar meter.
    RetVal = SysCmd(acSysCmdInitMeter, "Reading BLOB", _
             FileLength \ 1000)          ' Put first record in edit mode.
'          T.MoveFirst
'          T.Edit
    T.AddNew
    ' Read the leftover data, writing it to the table.
    FileData = String$(LeftOver, 32)
    Get SourceFile, , FileData
    T(sField).AppendChunk (FileData)
    RetVal = SysCmd(acSysCmdUpdateMeter, LeftOver / 1000)
    ' Read the remaining blocks of data, writing them to the table.
    FileData = String$(BlockSize, 32)
    For I = 1 To NumBlocks
        Get SourceFile, , FileData
        T(sField).AppendChunk (FileData)
        RetVal = SysCmd(acSysCmdUpdateMeter, BlockSize * I / 1000)
    Next I          ' Update the record and terminate function.
    T.Update
    RetVal = SysCmd(acSysCmdRemoveMeter)
    Close SourceFile
    ReadBLOBNeu = FileLength
    Exit Function
Err_ReadBLOB:
ReadBLOBNeu = -Err
MsgBox "ReadBLOB Error " & Err & " : " & Error$
Exit Function
End Function
Hoffe das kann die Frage beantworten.

Vielleicht noch eine Anschlussfrage dazu, wäre es besser von Access nach Sqlite oder MySql zu wechseln?? Ist das einfacher?

Schon mal vielen Dank für Deine Hilfe.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Access Blob und Gifs Binär

Beitrag von Kiffi »

TheSaint hat geschrieben:Hm, sorry, kann leider nichts im moment mit dem Begriff native anfangen.
Nativ wäre es, wenn es eine in Access fest eingebaute Funktion ist (wie
z.B. OpenDatabase(), OpenRecordset(), etc.). In Deinem Fall rufst Du
eine eigenprogrammierte Routine auf. Somit ist ReadBlob nicht nativ.
TheSaint hat geschrieben:Vielleicht noch eine Anschlussfrage dazu, wäre es besser von Access nach Sqlite oder MySql zu wechseln?? Ist das einfacher?
mh, das ist Geschmackssache. Ich persönlich finde SQLite wesentlich
einfacher zu handeln als Access. Erstens ist es in PB integriert (also nativ
nutzbar ;-)), Du brauchst kein ODBC oder COMate, es ist
plattformunabhängig und SQLite unterstützt typenlose Felder, die ich als
sehr nützlich betrachte. Zwar hat Fred (noch) keine direkte Unterstützung
von BLOBs in PB integriert, aber es gibt hier und im englischen Board
einiges an Code von Thomas (ts-soft) und mir.

Wenn Du auf Access-VBS verzichten kannst und eine Single-
User-Datenbank suchst*, bist Du mit SQLite IMO sehr gut beraten.

Grüße ... Kiffi

*: Im englischen Forum gibt es ein, zwei Links zu recht
interessanten SQLite-Servern. Mit Hilfe deren kann man SQLite auch auf
Mehr-User-Systemen einsetzen.

// Edit: Hier der Link, um die in PB noch nicht umgesetzten SQLite-
Funktionalitäten nutzen zu können (das ist doch der aktuellste Code,
Thomas?). Die BLOB-Beispiele sind unten am Posting angehängt:

http://www.purebasic.fr/english/viewtop ... 885#261885
a²+b²=mc²
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Kiffi,

wow, ich bin begeistert.
Deine Hilfestellungen und Erklärungen sind einfach spitze.
Vielen Dank.

Hm, diesen Link den Du aufgezeigt hast, verweist auf die
Bearbeitung der Blobs, die in einer SQlite Datenbank gespeichert sind.
Läßt sich der folgende Code auch so ändern, dass ich ihn für eine
Access Datenbank nutzen kann?
Oder, und das wäre eine neue Baustelle für mich, hast Du daran
gedacht, dass ich die Access Datenbank nach SQlite transferiere?

Code: Alles auswählen

EnableExplicit

XIncludeFile "SQLite3.pbi"

Define Mem, File, Size, hDB, lStatement

hDB = OpenDatabase(#PB_Any, "logo.db", "", "")
If hDB = #False
  Debug "Can't open database"
  End
EndIf

lStatement = SQLitePrepare(hDB, "Select fldBlob From tblBlob")

If lStatement
  SQLiteStep(lStatement)
  Size = SQLiteColumnByte(lStatement, 0)
  Mem = SQLiteColumnBlob(lStatement, 0)
  If Mem
;     File = CreateFile(#PB_Any, "logo.bmp")
;     If File
;       WriteData(File, Mem, Size)
;       CloseFile(File)
;     EndIf
    CatchImage(0, Mem)
    OpenWindow(0, #PB_Ignore, #PB_Ignore, ImageWidth(0), ImageHeight(0), "blob - example")
    ImageGadget(0, 0, 0, ImageWidth(0), ImageHeight(0), ImageID(0))
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  SQLiteFinalize(lStatement)
EndIf

CloseDatabase(hDB) 
Ich denke, dass ich es hinbekommen könnte, alle Tabellen von
Access nach SQlite zu transferieren, aber... die Reports die ich in
Access habe,... da weis ich nicht, wie ich das machen soll. Wahrscheinlich neu manuell aufbauen.

Ich hoffe, ich nerve nicht zu viel, wenn ich als letztes noch die Frage stelle, ob es möglich ist diese Access oder SQlite Datenbank in die PureBasic Exe zu integrieren, so dass ich nur eine Datei habe und nicht die Exe und eine Datenbank.

Nochmals vielen Dank, auch für Deine / Eure Geduld mit mir.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Re: Access Blob und Gifs Binär

Beitrag von TheSaint »

Hallo Zusammen,
hallo Kiffi,
Kiffi hat geschrieben: // Edit: Hier der Link, um die in PB noch nicht umgesetzten SQLite-
Funktionalitäten nutzen zu können (das ist doch der aktuellste Code,
Thomas?). Die BLOB-Beispiele sind unten am Posting angehängt:

http://www.purebasic.fr/english/viewtop ... 885#261885
wenn ich den vorgeschlagenen Code benutze, kommt folgende Fehlermeldung:

Zeile 64: Ungültiger Name. derselbe wie ein externer Befehl.
und zwar bei der Codezeile und noch einige folgende Codezeilen:

Code: Alles auswählen

  SQLite3_Prepare (hDB.i, Statement.p-utf8, nBytes.i, *hResult, *pzTail = 0)
Nachdem ich dann herausgefunden habe, dass das wohl die PBOSL_SQLite3 vermutlich verursacht, habe ich sie rausgenommen, den Compiler neugestartet und dann kommen bei dem Code folgende Meldungen:

POLINK: error: Unresolved external symbol 'SQLite3_Blind_Blob'.

und noch weitere Meldungen mit POLINK ...
Hm, damit kann ich im Moment gar nichts anfangen.

Was mache ich den da falsch, oder was muss ich machen, damit es
funktioniert??

Schon mal vielen Dank für Eure Hilfe
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Wenn Du PB4.30 verwendest, sollteste die letzte Include, die auch der obige link angibt nutzen. Im Header steht:
SQLite3.pbi hat geschrieben:; new Version For PB 4.30 + using static lib from pb
; supports 64-Bit
PBOSL gibts nicht für PB4.30, also weg damit!

> POLINK: error: Unresolved external symbol 'SQLite3_Blind_Blob'.
Blinden Blob gibts nicht :mrgreen:
Das ist so definiert:

Code: Alles auswählen

sqlite3_bind_blob (lStatement.i, lIndex.i, lBinaryBuffer.i, lBinaryBufferLength.i, *void = -1)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo ts-soft,
ts-soft hat geschrieben: Wenn Du PB4.30 verwendest, sollteste die letzte Include, die auch der obige link angibt nutzen. Im Header steht:
SQLite3.pbi hat geschrieben:; new Version For PB 4.30 + using static lib from pb
; supports 64-Bit
PBOSL gibts nicht für PB4.30, also weg damit!
ja diese Include benutze ich. Hier das was im Header steht:
; SQLite3 Include for Windows, Linux and MacOS
; based on a example by MLK
; binding functions based on code by Kiffi (PBOSL)
; tested with Ansi and Unicode under WinXP and XUbuntu
; Autor: ts-soft
; new Version For PB 4.30 + using static lib from pb
; supports 64-Bit

; New Version 2008/10/02
; since beta 3 you can mix native commands with API command, so i have make some changes and removed useless functions
Die Version ist doch richtig, oder?

Hm, das mit der PBOSL wusste ich nicht. Habe sie jetzt entfernt.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

TheSaint hat geschrieben:Die Version ist doch richtig, oder?
Die sollte funktionieren, gegeteiliges ist mir nicht bekannt
TheSaint hat geschrieben:Hm, das mit der PBOSL wusste ich nicht. Habe sie jetzt entfernt.
PBOSL wird wohl bald als Include erscheinen, zuviele Probleme mit Tailbite
libs, die sind nach fast jedem PB Update nicht mehr lauffähig.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten