Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
Wer kann mit sagen, wie man in Delphi 4 in eine Oracle 8 DB ein JPeg-Bild einfügt. Der Datentyp des zu füllenden Feldes ist meiner Meinung nach "Long Raw". Stimmt das ?
Hallo Michael,
versuche mal folgendes:
Beispiel für Oracle auf NT
1.) Der Benutzer muss EXECUTE Recht con SYS.DBMS_LOB haben.
2.) Erstelle ein DIRECTORY auf dem Oracle DB-Server (am besten vom Admin)
CREATE DIRECTORY PICTURES ON 'c:\PICTURES';
GRANT READ ON DIRECTORY PICTURES TO PUBLIC;
3.) Tabelle
CREATE TABLE BILDER(
BILD_ID NUMBER(10,0) NOT NULL CONSTRAINTS PK_BILD_ID PRIMARY KEY,
BILD BLOB)
LOB (BILD) STORE AS
(TABLESPACE PICTURE
STORAGE (INITIAL 6144 NEXT 6144)
CHUNK 4000
NOCACHE LOGGING
);
4.) Erstelle eien Procedure auf der Datenbank (Beispiel)
Hier werden 4 Parameter übergeben.
1 - Der Bildindex
2 - Der Dateiname der Graphik
3 - Die Größe der Graphikdatei
4 - Soll ein neues Record erstellt werden, oder ein altes geändert
CREATE OR REPLACE PROCEDURE LOAD_PICTURE
(mid NUMBER, mfile varchar2, mSize INTEGER, InsOrUpdate VARCHAR2)
as
mBLOB BLOB;
mBfile BFILE := BFILENAME('PICTURE', mfile);
AMOUNT INTEGER := mSize;
NewId Number(10,0);
begin
NewId := mId;
/* Fügt neues Bild ein Achtung, prüft nicht ob Tabelle leer ist !*/
IF InsOrUpdate = 'I' then
SELECT MAX(INDX) + 1 INTO NewId FROM PIC_TEST;
INSERT INTO BILDER VALUES(NewId, EMPTY_BLOB());
COMMIT;
END IF;
/* Datensatz zum ändern */
SELECT BILD INTO mBlob FROM BILDER
WHERE indx = NewId
FOR UPDATE;
/* Einlesen der Graphic. Egal ob Bitmap, Jpeg usw. */
DBMS_LOB.OPEN (mBFILE, DBMS_LOB.LOB_READONLY);
DBMS_LOB.LOADFROMFILE(mblob, mBFILE, amount);
DBMS_LOB.CLOSE(mBFILE);
COMMIT;
end;
In deinem Programm kannst du diese Procedure dann aufrufen.
Wähle eine Graphik aus, ermittle die Größe der Garphik (FileSize) und
übergebe die Parametr an die Procedure.
//Store Image
//Query 1 Holds
{
insert into blob_test (id, image) values
(:id,empty_blob()) returning image into :image
}
procedure TForm1.Button1Click(Sender: TObject);
var JP : TJpegImage;
begin
If OpenDialog1.Execute then
begin
query1.ParamByName('Image').LoadFromFile(Opendialo g1.FileName,ftOraBlob);
query1.ParamByName('Id').AsInteger := StrToInt(Edit1.text); //temporary solution
Try
query1.ExecSQL;
JP := TJpegImage.Create;
try
JP.LoadFromFile(Opendialog1.FileName);
Image1.Picture.Bitmap.Assign(JP);
finally
JP.Free;
end;
except;
end;
end;
end;
//get Image
//query2 Holds - is not live
{
Select * from blob_test
}
procedure TForm1.Query2AfterScroll(DataSet: TDataSet);
var
BS : TBlobStream;
JP : TJPegImage;
begin
If not TBlobField(Query2.FieldByName('IMAGE')).IsNull then
begin
BS := TBlobStream.Create(TBlobField(Query2.FieldByName(' Image')),bmRead);
JP := TJPegImage.Create;
try
JP.LoadFromStream(BS);
Image1.Picture.Bitmap.Assign(JP);
finally
BS.Free;
JP.Free;
end;
end
else
Image1.Picture.Bitmap.Assign(Nil);
end;
//query2 Refresh
procedure TForm1.Button2Click(Sender: TObject);
begin
query2.Close;
query2.Open;
end;
end.
meikl
remark,
against the copyright-rules of this forum,
this text keeps copyrighted by meikl
all rights reserve
Comment