Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[7461] Re:Query 컴퍼넌트를 이용해 Blob 데이터를 저장하거나 불러오기
박지훈.임프 [cbuilder] 5898 읽음    2001-09-27 02:01
임프랍니다.

원래의 소스가 TADOTable을 이용하는 소스였나보네요.
그런데 님께서는 TADOQuery를 사용하시니, 원래의 소스를 그대로 사용할 수가 없습니다.

테이블에서 새로운 값을 추가하기 위해서는 TField 객체를 사용하지만, 쿼리에서는 쿼리문에 사용된 파라미터,
즉 TParameter 객체를 사용합니다. 그러므로 보여주신 소스의 SaveToBlob()의 인자를 TParameter로 바꾸어야
합니다. 그러기 위해서는 TADOQuery.Parameters.ParamByName() 함수를 사용하면 됩니다.
(만약 TADOQuery 대신 TQuery라면 TADOQuery.ParamByName()입니다.)

하지만, TADOQuery에 이미지를 넣거나 빼기 위해 보여주신 소스와 같은 번거로운 방법을 쓸 필요는 없습니다.
원래 소스를 작성하신 분이 blob 데이터를 다루는 방법에 익숙하지 않아 이상한 방법을 쓰신 것 같네요.
소스를 다음과 같이 수정해보세요. 소스에 포함되어 있던 SaveToBlob()나 LoadFromBlob() 함수는 필요없습니다.
쿼리문은 제가 임의로 넣어본 것입니다. 사용하실 실제 쿼리로 바꾸세요.

procedure TForm1.Button1Click(Sender: TObject);
var
  Param: TParameter;
begin
  ADOQuery1.SQL.Text := 'insert into ttt (sn, bin) values (1, :bin)';
  Param := ADOQuery1.Parameters.ParamByName('bin');
  Param.LoadFromFile('c:\Borland.jpg', ftBlob);
  ADOQuery1.ExecSQL();
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  BS: TBlobStream;
  FS: TFileStream;
begin
  ADOQuery1.SQL.Text := 'select * from ttt';
  ADOQuery1.Open;
  FS := TFileStream.Create('c:\bbb.jpg', fmCreate);
  BS := TBlobStream(ADOQuery1.CreateBlobStream(ADOQuery1.FieldByName('bin'), bmRead));
  FS.CopyFrom(BS, 0);
  FS.Free;
  BS.Free;
end;

그럼 이만...


kittysp 님이 쓰신 글 :
: 아래에 있던 글에서 발췌한 소스로 JPG 파일을 ADOQuery를 만들어서 DB에 넣는 작업을 하고 있습니다.
:
: 그런데, 소스 상에서는 DB이름과 field 항목만이 있을 뿐, Table을 지정하는 부분이 없네요. 그래서 Table 이름을 지정해 주려고, ADO Component를 이것저것 섞어서 써봤는데 소용이 없습니다. 고수님들께 부탁드립니다.
:
: 제가 짜놓았던 소스를 아래 첨부해드리겠습니다.
: button1을 누르면, 같은 디렉토리에 있는 JPG 파일이 DB로 저장되고, button2를 누르면 DB에 있는 image field에서 JPG파일이 만들어지는 소스로 알고 있습니다.
: 어떻게 하면 table 이름을 지정해 줄 수 있을까요...
:
: ===============================================================================
:
: unit Unit1;
:
: interface
:
: uses
:  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
:  Dialogs, DB, ADODB, StdCtrls;
:
: type
:  TForm1 = class(TForm)
:    Button1: TButton;
:    Button2: TButton;
:    ADOQuery1: TADOQuery;
:    procedure Button1Click(Sender: TObject);
:    procedure Button2Click(Sender: TObject);
:  private
:    { Private declarations }
:  public
:        function LoadFromBlob(const AField: TField; const Stream: TStream): boolean;
:        function SaveToBlob(const Stream: TStream; const AField: TField): boolean;
:
:    { Public declarations }
:  end;
:
: var
:  Form1: TForm1;
:
: implementation
:
: {$R *.dfm}
:
: { TForm1 }
:
: function TForm1.LoadFromBlob(const AField: TField;
:  const Stream: TStream): boolean;
: var
: ResultStr: string;
: PResultStr: PChar;
: begin
: Result := false;
: if (Assigned(AField)) and (Assigned(Stream)) then begin
:   try
:     ResultStr := AField.Value;
:     PResultStr := PChar(ResultStr);
:     Stream.Write(PResultStr^, Length(ResultStr));
:     Stream.Seek(0,0);
:     Result := true;
:   except
:   end;
: end;
:
: end;
:
: function TForm1.SaveToBlob(const Stream: TStream;
:  const AField: TField): boolean;
: var
: FieldStr: string;
: PFieldStr: PChar;
: begin
: Result := false;
: if (Assigned(AField)) and (Assigned(Stream)) then begin
:   try
:     Stream.Seek(0,0);
:     SetLength(FieldStr, Stream.Size);
:     PFieldStr := PChar(FieldStr);
:     Stream.Read(PFieldStr^, Stream.Size);
:     AField.Value := FieldStr;
:     Result := true;
:   except
:   end;
: end;
:
: end;
:
:
: // save to DB
: procedure TForm1.Button1Click(Sender: TObject);
: var
: FS: TFileStream;
: begin
: FS := TFileStream.Create('aaa.jpg', fmOpenRead);
: SaveToBlob(FS, ADOQuery1.FieldByName('snapshot'));
:   // 이 부분에서 table 이름이 없어서 snapshot이라는 field가 없다고 계속 오류남
: FS.Free;
:
:
: end;
:
: // load DB to image file
: procedure TForm1.Button2Click(Sender: TObject);
: var
: FS: TFileStream;
: begin
: FS := TFileStream.Create('bbb.jpg', fmCreate);
: LoadFromBlob(ADOQuery1.FieldByName('snapshot'), FS);
: FS.Free;
:
: end;
:
: end.
:

+ -

관련 글 리스트
7460 [질문] JPG->DB (image field)에 저장하는 문제 중 질문사항.. kittysp 1601 2001/09/26
7461     Re:Query 컴퍼넌트를 이용해 Blob 데이터를 저장하거나 불러오기 박지훈.임프 5898 2001/09/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.