Q&A

  • MS-SQL에서 IMAGE 저장및 읽기
저장은 되는데 읽기가 안됩니다.

읽기에서 '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;
///////////////////////////////////////////////////////////////////////////////////////////////////////////

샘풀 프로그램을 올립니다. 고견부탁합니다
2  COMMENTS
  • Profile
    김기원 2007.11.22 19:40
    안녕하세요.

    비슷하게 만들어서 테스트 해봤는데 잘 처리됩니다. ^^;
    아래 코드대신....

    저장할때 Image1.Picture.Graphic.SaveToStream(memStream);
    이렇게 저장했습니다.

  • Profile
    이우석 2007.11.22 21:29
    매우고맙습니다.
    그런데 BMP 파일은 잘됩니다. 그러나 JPG 파일이 읽어지지 않고 똑같은 에러가납니다.
    다시한번 고견을 듣고 싶습니다.


    • 최용일
      2007.11.27 03:14
      Zeos하고는 별 상관이 없습니다. UTF8로 인코딩/디코딩해서 사용하시거나 MySQL에 접속후에 'set NA...
    • 김기문
    • 2007.11.26 05:05
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2007.11.27 23:19
      안녕하세요.. 컴포넌트 이름들을 배열에 스트링으로 넣어두시고 FindComponent 로 찾으시면 사용은 가능...
    • 이정욱
      2007.11.25 16:23
      컴포넌트 이름은 배열로 만들 수 없습니다. 단, 컴포넌트는 배열로 만들거나 사용할 수 있습니다. 예...
    • 왕초보
    • 2007.11.25 04:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2007.11.25 21:26
      ADOConnection 컴포넌트를 올려 놓고, 커넥션 스트링 속성에 cnstr내용을 집어 넣으시면 일단 커넥션 컴포...
    • nilriri™
      2007.11.27 03:47
        Self.EmbeddedWB1.DisabledPopupMenus := self.EmbeddedWB1.DisabledPopupMenus + [rcmDefault...
    • 이현우
    • 2007.11.25 02:36
    • 1 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2007.11.26 20:41
      WinInet.pas 유닛에 정의되어있는... function InternetGetCookie;     &nb...
    • 유경민
    • 2007.11.24 04:43
    • 4 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2007.11.24 06:05
      버튼1클릭할때   Frame.WebBrowser1.BringToFront; 버튼2클릭할때   Frame.WebBrow...
    • 유경민
      2007.11.27 05:32
      답변 감사드립니다 ㅠ.ㅠ 그런대도 잘안되요. EmbeddedWB 이걸로 바꿨습니다. 이게 메인소스에요 ...
    • nilriri™
      2007.11.27 18:40
      뭐가 안된다는 거죠? 소스를 보니까 웹브라우져를 바꿔주는 코드가 하나도 없는데... 버튼 클릭이벤...
    • 유경민
      2007.11.28 03:41
      레프트에 넣는게 아니라 메인에 넣는거였군요..
    • Marek
      2007.11.27 10:13
      안녕하세요 화면캡쳐는 PrtSc 또는 Alt+PrtSc을 모두 전역핫키에 등록하여 사용하며 내 어플이 Active하...
    • 이현우
      2007.11.25 03:22
      메시지 후킹이용하세요.. [Print Screen]키 메시지만 후킹해도 원하는 답을 찾으실것 같은데요..
    • 김무승
      2007.11.27 00:16
      [Print Screen]키를 후킹하는 방법은 키를 사용하지 않고 일반 프로그램 캡춰하면 막을 수가 없지 않나...
    • 박진오
    • 2007.11.24 02:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 뚜버기^^v
      2007.11.24 06:29
      http://www.tmssoftware.com/ 여기 같은데요.. ^^
    • 델퐈이~
    • 2007.11.23 23:52
    • 1 COMMENTS
    • /
    • 0 LIKES
    • Marek
      2007.11.27 09:58
      안녕하세요 아래와 같이 해보세요. <!--CodeS--> uses에  DDEMan을 포함 procedure ...
    • 이정욱
      2007.11.24 05:45
      <!--CodeS--> procedure Process32List(Slist: TStrings); var Process32: TProcessEntry32; SHa...
    • jason
    • 2007.11.23 03:53
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이승철
    • 2007.11.23 01:45
    • 6 COMMENTS
    • /
    • 0 LIKES
    • 델코초
      2007.11.23 02:11
    • 왕초보
      2007.11.23 02:42
    • 델코초
      2007.11.23 03:05
    • 이승철
      2007.11.23 18:57
    • 최용일
      2007.11.23 21:53
    • 이승철
      2007.11.26 19:20
    • nilriri™
      2007.11.24 05:32
      팁/테크 게시판이나 리소스 자료실에 제가 작성한 관련글 있습니다. 참고하세요..^^ <!--CodeS--...
    • 이우석
    • 2007.11.22 17:32
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김기원
      2007.11.22 19:40
      안녕하세요. 비슷하게 만들어서 테스트 해봤는데 잘 처리됩니다. ^^; 아래 코드대신.... 저장할때 I...
    • 이우석
      2007.11.22 21:29
      매우고맙습니다. 그런데 BMP 파일은 잘됩니다. 그러나 JPG 파일이 읽어지지 않고 똑같은 에러가납니다. ...
    • 이정욱
      2007.11.22 23:45
      비스타에서는 BDE를 사용하시려면 관리자 권한이 있으셔야 할것입니다. 그것 뿐아니라 쓰기가 금지되어있는...
    • dohee kim
      2007.11.27 09:02
      답변 주셔서 감사합니다. 제가 질문을 깔끔하게 못해서 다시 정리하겠습니다. 제가 쓰고 있는 환경은 VIS...
    • 구창민
      2007.11.23 00:45
      안녕하세요... 아래처럼 해보세요.. ...   public     { Public decla...
    • 이정욱
      2007.11.22 23:42
      더블클릭 이벤트에서 Memo1.SelLength := 0; 를 넣어보세요.
    • 하덕진
      2007.11.24 00:17
      확인해보셔도 정말로 냉무 입니다 ^^
    • 이정욱
      2007.11.22 23:49
      IE.Width := 100; IE.Height := 100; 을 추가해보세요 ^^
    • 김기원
    • 2007.11.22 04:06
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 구창민
      2007.11.23 01:07
      안녕하세요.. RichEdit 의 내용을 .rtf 파일로 저장하고 출력하면 안되나요?
    • 김기원
      2007.11.24 19:54
      안녕하세요. DB에 내용을 출력하느라 .rtf 파일로 저장후 출력은 다른 필드와 같이하기 때문에 불가능했...