Announcement

Collapse
No announcement yet.

Oracle Blob-Felder mit JPeg-Bildern füllen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Oracle Blob-Felder mit JPeg-Bildern füllen

    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 ?

    Ich bin für jede Hilfe dankbar !!!

  • #2
    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.

    Gruß
    Matthia

    Comment


    • #3
      muß nicht so kompliziert sein

      unit ora8_blob_u;

      interface

      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, DBTables, StdCtrls, ExtCtrls, jpeg, Grids, DBGrids;

      type
      TForm1 = class(TForm)
      Image1: TImage;
      Button1: TButton;
      Button2: TButton;
      Query1: TQuery;
      Query2: TQuery;
      OpenDialog1: TOpenDialog;
      Edit1: TEdit;
      DataSource1: TDataSource;
      DBGrid1: TDBGrid;
      procedure Button1Click(Sender: TObject);
      procedure Query2AfterScroll(DataSet: TDataSet);
      procedure Button2Click(Sender: TObject);
      private
      { Private declarations }
      public
      { Public declarations }
      end;

      var
      Form1: TForm1;

      implementation

      {$R *.DFM}

      (*
      //Table definition
      CREATE TABLE blob_test
      (
      id NUMBER(9),
      image BLOB
      )
      *)

      //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


      • #4
        ist es nicht ein schreckliches forum,
        wo man html tags im kopf haben muß,
        um seinen text formatiert zu bekommen,
        sehr veraltete technik :-

        Comment

        Working...
        X