Q&A

  • blob를 사용하여 DB에 이미지를 넣고자합니다.


blob를 사용하여 DB에 이미지를 입력/조회/출력을 하고자하는데

DB에 입력시 에러가 발생하여 입력을 못하고 있습니다.

DB는 오라클9i 이고 개발은 델파이3으로 하고 있습니다.

델에서 직접 코딩으로 입력하고자 하였고 OpenDialog를 이용해

파일을 찾아 등록하고자 합니다.


    Close;
    Clear;
    Add('INSERT   INTO       ');
    Add('M0IMAGE (MCODE,     ');
    Add('         PIX1,      ');
    Add('         PIXINF1,   ');
    Add('         PIX2,      ');
    Add('         PIXINF2,   ');
    Add('         indt,      ');
    Add('         indd)      ');
    Add(' VALUES (:MCODE,    ');
    Add('         :PIX1,     ');
    Add('         :PIXINF1,  ');
    Add('         :PIX2,     ');
    Add('         :PIXINF2,  ');
    Add('         :indt,     ');
    Add('         :indd)     ');

    Params.ParamByName('MCODE').AsString := Trim(ComboBox2.Text);
    Params.ParamByName('pix1').LoadFromFile(OpenDialog1.FileName, ftBlob);
    Params.ParamByName('pixinf1').AsString := OpenDialog1.FileName;
    Params.ParamByName('pix2').LoadFromFile(OpenDialog2.FileName, ftBlob);
    Params.ParamByName('pixinf2').AsString := OpenDialog2.FileName;
    Params.ParamByName('INDT').AsString := Trim(edtProjDt.Text);
    Params.ParamByName('INDD').AsString := Trim(edtDamdang.Text);


위와 같이 코딩하여 컴파일하면 이상은 없는데 실행시 아래와 같은 에러가 발생합니다.


  Project G.exe raised exception class EDBEngine Error with message
  'General SQL error. ORA-01008: 일부변수가 결합되지 않았습니다'.
  Process stopped. Use Step or Run to continue.


BDE 환경은 아래와 같이 허준님 써놓으신글을 보고 바꾸었네염

DLL32          : SQLORA32.DLL
VENDER INIT    : ORA73.DLL
blob SIZE      : 20480
blobS TO CACHE : 40960
ROWSET SIZE    : 80

어떤식으로 코딩을 해야되는지...아니면 어떤식으로 환경설정을 바꾸어야 될지

조언 바랍니다.
2  COMMENTS
  • Profile
    오병주 2004.02.07 02:01
    TMemoryStream이 함수로  해보심이 어떠하실런지..

    var
        mem: TMemoryStream;
        bjpg: TJPEGImage;
        Image1 : TImage;
    Begin

      mem    := TMemoryStream.Create;
      bjpg   := TJPEGImage.Create;
      Image1 := TImage.Create(Application);

      Image1.Picture.LoadFromFile(xOpenPictureDialog.FileName);
      bjpg.Assign(Image1.Picture);

      bjpg.SaveToStream(mem);
      mem.Position := 0;

    .
    .
    .
    .
    .

    ParamByName('pimage').LoadFromStream(mem,ftblob);

    이렇게 함 해보세요...

    즐프 ~


  • Profile
    Crazy 2004.02.07 02:35
    참고하세요..
    BItmap이면 JPEG로 변환해서 저장합니다.
    반대로 Bitmap 을 넣고싶다면 변환부분만 반대로 처리하면 되겠지만
    JPEG 에 비해 사이즈가 너무 크니 좀 무겁다는 감이 들겁니다..

    var
         BitImage  : TBitmap;
         JpegImage : TJPEGImage;
         MS: TMemoryStream;
    begin
         with Query_TEMP do
         begin
              //========================================================= Insert
              Close;
              SQL.Clear;
              SQL.Add('INSERT INTO CCA0051T (EMPECD, SIMAGE, CRTEMP, CRTTIM, UPDEMP, UPDTIM )');
              SQL.Add('VALUES (:EMPECD, :SIMAGE, :CRTEMP, :CRTTIM, :UPDEMP, :UPDTIM)');

              ParamByName( 'EMPECD' ).AsString := dxMemData_MainMEMBER.AsString + ' ';

              if Image_Open.Picture.Graphic is TBitmap then
              begin //===================================================== BMP SAVE
                   BitImage   := TBitmap.Create;
                   MS         := TMemoryStream.Create;

                   MS.Position := 0;
                   if Image_Open.Picture.Graphic = nil then
                   begin
                        ParamByName( 'SIMAGE' ).Assign( Image_Open.Picture.Bitmap );
                   end else begin
                        BitImage.Assign( Image_Open.Picture.Bitmap );
                        BitImage.SaveToStream( MS );
                        ParamByName( 'SIMAGE' ).LoadFromStream( MS, ftBlob );
                   end;
                   BitImage.Destroy;
              end else begin //=========================================== JPEG SAVE
                   JpegImage   := TJPEGImage.Create;
                   MS         := TMemoryStream.Create;

                   MS.Position := 0;
                   if Image_Open.Picture.Graphic = nil then
                   begin
                        ParamByName( 'SIMAGE' ).Assign( Image_Open.Picture.Bitmap );
                   end else begin
                        JPEGImage.Assign( Image_Open.Picture.Graphic );
                        JPEGImage.SaveToStream( MS );
                        ParamByName( 'SIMAGE' ).LoadFromStream( MS, ftBlob );
                   end;
                   JPEGImage.Destroy;
              end;

              ParamByName( 'CRTEMP' ).AsString := gs_UseEmpCd;
              ParamByName( 'CRTTIM' ).AsString := FormatDateTime( 'YYYYMMDDHHMM', now );
              ParamByName( 'UPDEMP' ).AsString := gs_UseEmpCd;
              ParamByName( 'UPDTIM' ).AsString := FormatDateTime( 'YYYYMMDDHHMM', now );

              ExecSQL;

              MS.Destroy;
         end;