Umgang mit Blob feldern

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Umgang mit Blob feldern

Beitrag von Christian »

ich stehe im Moment vor dem Problem, das es recht aufwendig ist mit dem LCL/VCL datenbanklayer in SQL Datenbanken auf Blob felder zuzugreifen.
Prinzipiell ist das nicht schwirig. ABER.
Ich will nicht jedesmal die Blob Felder mit abrufen also führ ich ein Select ohne die Blob Felder aus. Ich hab dann Routinen die mir die Blob Felder gesondert abrufen und laden. Beim ändern kommt jetzt aber das Problem.

Ich füge beispielsweise einen Datensatz ein. Jetzt will ich das Blob Feld mit setzen, dort kommts zum Problem das der Datensatz in der Datenbank nicht bekannt ist, da er ja noch im Cache der DataSet Komponente ist. Also führe ich vorher ein Post+ApplyUpdates durch. Nachfolgende Routinen erwarten jetzt aber unter Umständen das die Tabelle noch im State dsInsert ist ...
Gibts keine sauberere Möglichkeit das zu tun ?
Nächstes Problem ist das ich keine Binärdaten übergeben kann, hat jemadn einen effizienten Algorythmus um das zu tun ? Im Moment benutze ich Base64.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Es sollte möglich sein Binärdaten zu übergeben.
Dafür gibts ja den Blobtyp binär. Ich kenn es allerdings nur von Delphi her, um ein Blobfeld bspw. mit einem Bild zu fühlen, musst du einen Stream zur Datenbank öffnen und kannst es anschließend über diesen Stream in die Datenbank ablegen.

Ich hab es nie gemacht...aber im Editmodus sollte es möglich sein, den Stream ins Blob zu schreiben und anschließend mit post zu beenden.
Johannes

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Ja, mir gehts nicht ums technische sondern eher um den ablauf. technisch funktioniert das schon mit TBlobField und seinen Methoden (LoadFromFile,SaveToFile,LoadFroream,SaveToStream)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: Umgang mit Blob feldern

Beitrag von theo »

Christian hat geschrieben:Nächstes Problem ist das ich keine Binärdaten übergeben kann, hat jemadn einen effizienten Algorythmus um das zu tun ? Im Moment benutze ich Base64.
Der basE91 soll datenmässig etwas effizienter sein. Geschw. weiss ich nicht.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

lieber nicht, dort ist " mit im Alphabet und ich weiss nicht ob das so gut ist bei SQL...

Meine derzeitige impementierung schein ganz gut zu laufen auch wenn mir ne sauberere Lösung vorschwebte aber scheint wohl nicht so einfach möglich.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Beitrag von piper62 »

Aufgrund von Problemen mit BLOB Feldern bin ich dazu übergegangen zwei Queries zu benutzen.
In Deinem Fall könntest Du in der einen für die Übersicht die Daten ohne BLOBs laden und dann mit der zweiten die Bearbeitung übernehmen.
Dabei weisst Du ja schon den Datensatz, den Du berabeiten möchtest und kannst nur diesen laden. Dabei ist es dann auch möglich ein "select ... for update" für ein Record-Lock abzusetzen.

Wegen BLOB Felder muss ich noch anmerken, dass es unter Umständen nötig sein kann die Codepage Einstellungen auf der Connection zu ändern. Wir hatten Probleme mit UTF8 und BLOBs. Zum Schreiben deaktivieren wir temporär die UTF8 Einstellung in der ZConnection und setzen sie nach dem Schreibvorgang wieder.

Gruss,
Tibor

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wie oben schon geschrieben mach ichs ja jetzt schon so, nur das ich ein problem hab wenn ich einen Datensatz einfüge dann muss ich den erst posten um das Blob anhängen zu können was unter Umständen Probleme macht...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Beitrag von piper62 »

dann würde ich folgendes Vorgehen vorschlagen:
-Datensatz einfügen
-last insert id holen
-in der zweiten Query diese öffnen und in diesen Datensatz das BLOB schreiben.

Gruss,
Tibor

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Liest du eigentlich ma was ich schreibe ? So mach ichs doch jetzt...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Beitrag von piper62 »

Dann sehe ich das Problem nicht.

Müsstest Du ev. mal genauer erklären wo Du bei diesem Vorgehen ein Problem siehst.

Du trennst damit sauber das Eintragen von "normalen" Feldern und dem BLOB Feld.
Von der Seite der Transaktionen der Datenbank sehe ich da keine Probleme.

Ausserdem solltest Du nicht so gereizt reagieren.
Versuche ja nur zu helfen...

Gruss,
Tibor

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

HJab schon 2x geschrieben warum ich das nicht toll finde, ich weiss nicht wie ichs noch anders schreiben soll sorry.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten