에러가 난 직접적인 원인은, TPicture 객체에 TField 객체를 직접 Assign() 했기 때문입니다.
두 클래스의 객체들은 당연히 서로 호환이 안되므로 어사인이 안됩니다.
BLOB 필드의 값을 가져오려면, TBlobStream이나 CreateBlobStream을 이용해야 합니다.
헬프에 보시면 친절한 제가 있고, 다음의 글도 참고해보세요.
http://delphi.borlandforum.com/impboard/impboard.dll?action=read&db=del_qna&no=7461
그럼...
이우석 님이 쓰신 글 :
: 저장은 되는데 읽기가 안됩니다.
:
: 읽기에서 'Bitmap Image is not Valid' 라는 에러가 납니다.
: 원인을 모르게어요
:
: MSSQL에서 테이불은
:
: 열이름 데이터형식 길이
: EmpCode varchar 10
: Picture image 16
:
: 간단히 이렇게 디자인되었습니다.
:
: Delphi 7을 사용하고 있습니다.
:
: ////////////////////////////////////////////////////////////////////////////////////////////////
: unit Unit1;
:
: interface
:
: uses
: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
: Dialogs, StdCtrls, ExtCtrls, DB, ADODB, ExtDlgs, Jpeg, Grids, DBGrids,
: DBCtrls;
:
: type
: TForm1 = class(TForm)
: ADOConnection1: TADOConnection;
: QQ: TADOQuery;
: Button1: TButton;
: OPD: TOpenPictureDialog;
: btnSave: TButton;
: btnRead: TButton;
: DataSource1: TDataSource;
: DBImage1: TDBImage;
: Panel1: TPanel;
: IMG: TImage;
: Panel2: TPanel;
: IMG1: TImage;
: procedure Button1Click(Sender: TObject);
: procedure btnSaveClick(Sender: TObject);
: procedure btnReadClick(Sender: TObject);
: private
: public
: end;
:
: var
: Form1: TForm1;
:
: implementation
:
: {$R *.dfm}
: //그림찾기
: procedure TForm1.Button1Click(Sender: TObject);
: begin
: if OPD.Execute then
: IMG.Picture.LoadFromFile(OPD.FileName);
: end;
: //저장
: procedure TForm1.btnSaveClick(Sender: TObject);
: var BitImage : TBitmap;
: JpegImage : TJPEGImage;
: MemStream : TMemoryStream;
: begin
: QQ.Close;
: QQ.SQL.Clear;
: QQ.SQL.Add('INSERT INTO TMP_PICTURE (EmpCode, Picture )');
: QQ.SQL.Add('VALUES (''2000'', :Picture)');
: if IMG.Picture.Graphic is TBitmap then begin
: BitImage := TBitmap.Create;
: MemStream := TMemoryStream.Create;
:
: MemStream.Position := 0;
: if IMG.Picture.Graphic = nil then begin
: QQ.Parameters.ParamByName( 'PICTURE' ).Assign( IMG.Picture.Bitmap );
: end
: else begin
: BitImage.Assign( IMG.Picture.Bitmap );
: BitImage.SaveToStream( MemStream );
: QQ.Parameters.ParamByName( 'PICTURE' ).LoadFromStream( MemStream, ftBlob );
: end;
: QQ.ExecSQL;
: BitImage.Destroy;
: MemStream.Destroy;
: end else
: if IMG.Picture.Graphic is TJPEGImage then begin
: JpegImage := TJPEGImage.Create;
: MemStream := TMemoryStream.Create;
: MemStream.Position := 0;
: if IMG.Picture.Graphic = nil then begin
: QQ.Parameters.ParamByName( 'PICTURE' ).Assign( IMG.Picture.Bitmap );
: end
: else begin
: JPEGImage.Assign( IMG.Picture.Graphic );
: JPEGImage.SaveToStream( MemStream );
: QQ.Parameters.ParamByName( 'PICTURE' ).LoadFromStream( MemStream, ftBlob );
: end;
: QQ.ExecSQL;
: JPEGImage.Destroy;
: MemStream.Destroy;
: end;
: end;
:
: //읽기
: procedure TForm1.btnReadClick(Sender: TObject);
: begin
: QQ.Close;
: QQ.SQL.Clear;
: QQ.SQL.Add('select PICTURE from TMP_PICTURE');
: QQ.SQL.Add('where EMpCode = ''2000''');
: QQ.Open;
: if QQ.FieldByName('PICTURE').IsBlob then
: IMG1.Picture.Assign(QQ.FieldByName('PICTURE')); //여기서 에러 'Bitmap Image is not Valid'
: end;
: ///////////////////////////////////////////////////////////////////////////////////////////////////////////
:
: 샘풀 프로그램을 올립니다. 고견부탁합니다