Entwickler-Ecke

Datenbanken - Fehlermeldung bei Ändern von Blob


Hendrik - Do 31.01.08 14:28
Titel: Fehlermeldung bei Ändern von Blob
Hey!

Wenn ich versuche einen Blob in der Datenbank über


Delphi-Quelltext
1:
2:
3:
table.edit;
table.fieldbyname('Feld').asstring:=strinlist.text;
table.post;


zu ändern, bekomme ich folgende Fehlermeldung:
Zitat:

Connection is not defined

invalid BLOB ID

Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.


Was mache ich falsch? Zur Info: Ich benutze Firebird 2.0 mit Zeos 5.5.


mkinzler - Do 31.01.08 18:45

Blobs besser per Stream in einen Parameter schreiben.


Hendrik - Do 31.01.08 18:50

Ich konnte das Auftreten jetzt etwas näher eingrenzen:

Er tritt auf beim Ändern eines zweiten Blob-Feldes.
Also beispielsweise funktioniert folgendes:

Delphi-Quelltext
1:
2:
3:
table.edit;
table.fieldbyname('blob1').asstring:=strinlist.text;
table.post;


Das kann ich so oft ich will hintereinander machen. Ändere ich nun ein zweites Blob-Feld:


Delphi-Quelltext
1:
2:
3:
table.edit;
table.fieldbyname('blob2').asstring:=strinlist.text;
table.post;


Kommt der o.g. Fehler. Schließe und öffne ich die Tabelle vor dem Bearbeiten, klappt es ohne Probleme...
Welche Banalität hab ich übersehen bzw. nicht bedacht?


Hendrik - Do 31.01.08 19:10

user profile iconmkinzler hat folgendes geschrieben:
Blobs besser per Stream in einen Parameter schreiben.


Da ich die Felder gerne direkt über ein DBMemo bearbeiten würde, ist das etwas blöd... Muss ich vielleicht bei AfterPost irgendeinen Befehl eingeben?


Xentar - Do 31.01.08 19:12

DBMemo?
Dann nimm dafür doch ein varchar also String-Feld.

Blob ist eigentlich dafür gedacht, echte Daten (Bilder, (verschlüsselte) Dateien, usw) zu speichern.

Und wegen dem AfterPost:
Nö, normal nicht. Einfach Edit -> Neuen Wert rein -> Post, fertig.


hansa - Do 31.01.08 19:47

user profile iconXentar hat folgendes geschrieben:
..Blob ist eigentlich dafür gedacht, echte Daten (Bilder, (verschlüsselte) Dateien, usw) zu speichern...


Wieso denn das ? :shock: Noch nie was davon gehört, das es da Subtypes (Binary/Text) gibt ? DBMemo ist u.a. gedacht für Text-Blobs.


Hendrik - Do 31.01.08 20:06

user profile iconXentar hat folgendes geschrieben:
DBMemo?
Dann nimm dafür doch ein varchar also String-Feld.

Blob ist eigentlich dafür gedacht, echte Daten (Bilder, (verschlüsselte) Dateien, usw) zu speichern.


Das hab ich auch schon versucht... Aber dann bräuchte ich 8 32000 Zeichen Varchar Felder und da hat er gemeckert, weil es wohl zu viel ist...


hansa - Do 31.01.08 20:20

Du brauchst zu den Blobs etwas mehr Infos. Lemmy hat die : http://www.delphitutorials.de/blobs-in-ib-fb-2.html

@Lemmy : das da war schwer wiederzufinden. :mahn: :mrgreen:


Hendrik - Do 31.01.08 21:04

user profile iconhansa hat folgendes geschrieben:
Du brauchst zu den Blobs etwas mehr Infos. Lemmy hat die : http://www.delphitutorials.de/blobs-in-ib-fb-2.html


Ja das ist soweit schon klar... Ich habe 80-Byte Typ 1 Blobs in der Tabelle definiert. Aber ich kann pro Tabelle nur max. einen (auch über DBMemo) bearbeiten. Da sollte ich ja noch irgendwas verbockt haben?


hansa - Do 31.01.08 21:29

user profile iconHendrik hat folgendes geschrieben:
...Da sollte ich ja noch irgendwas verbockt haben?


Nicht unbedingt. Das "nur einen" stört mich im Zusammenhang mit Zeos. Da geht auch "nur eine" Transaction (EDIT :pro Datenbankverbindung). Nicht, dass da irgendwo eine zweite im Spiel ist. :shock: Das stammt allerdings jetzt nicht von mir, sondern von der Glaskugel. 8) Ich würde versuchen, das Problem zu reduzieren und somit die Grenzen ausloten, wenn es sie denn geben sollte.


Hendrik - Do 31.01.08 21:49

Ja ich kann natürlich mehrere Blobs innerhalb eines Edit --> Post ändern. Aber danach nur noch die, die da drin standen...
Jetzt hab ich es umgangen, indem ich vor jedem Bearbeiten die Table schließe und wieder öffne, aber wirklich "sauber" ist das nicht :(


hansa - Fr 01.02.08 00:31

user profile iconHendrik hat folgendes geschrieben:
...Jetzt hab ich es umgangen, indem ich vor jedem Bearbeiten die Table schließe und wieder öffne, aber wirklich "sauber" ist das nicht :(


Wenn das geht, dann sind es wohl tatsächlich die Transaction-Einschränkungen bei Zeos. :shock: Bei Freeware-Komponenten kann das passieren.