Hallo,
der Zugriff erfolgt mit den
ADO-Komponenten, die bei Delphi (diesmal D2010) dabei sind. Es ist aber noch Oracles
ODBC dazwischen, d.h.
ADO->
ODBC->Oracle.
Hier mal die Funktion wie ich sie jetzt benutze, wo ich nur noch evtl. schon vorhandene Einträge lösche (die Funktion ist jetzt nicht hier dabei, da einfach nur ein Delete) und dann neu einfüge.
Vorher stand da anstatt q.Insert sowas ala "If IDExists(ID) then q.Edit else q.Insert;"
Delphi-Quellcode:
procedure TBL.PutFileInDB(const id,Typ,fname:String; var filesize:integer);
var q:TADOTable;
s:TStream;
f:TFileStream;
begin
q:=TADOTable.Create(nil);
q.Connection:=Con;
q.TableName:=Table(TabDatei);
q.Open;
If FileExists(fname) then
begin
q.Insert;
q.FieldByName('ID').AsString:=id;
q.FieldByName('Typ').AsString:=Typ;
s:=q.CreateBlobStream(q.FieldByName('Datei'), bmReadWrite);
f:=TFileStream.Create(fname, fmOpenRead);
filesize:=s.CopyFrom(f,f.Size);
f.Free;
s.Free;
q.Post;
end
else
filesize:=0;
q.Free;
end;
@Perlsau: Was du gezeigt hast, war in etwa was ich meinte, aber das war in einem anderen Thread, wo du das noch ausführlicher geschrieben hast, ich kanns aber wie gesagt nicht mehr finden, war auch schon älter. Ich hab deine Funktion dabei nur als Hinweis genommen, wie man in den Blob schreibt/streamt, das aber nicht als eigene Funktion abstrahiert, sondern einfach mit dem Füllen der restlichen Tabellenfelder in einer Funktion gelassen.
Was mir aufgefallen ist, ist, das du in deinem Post von "Append" gesprochen hast, ich aber "Insert" benutzt habe. Könnte das Probleme im Zusammenhang mit Blobs Probleme machen? Der unterschied ist wie ich das verstanden habe ist doch nur, ob sich der Datensatzzeiger vor dem Einfügen ans Ende verschiebt oder nicht und ich dachte, das betrifft nur die clientseitige Anzeige und nicht den Speicherort in der
DB oder so.