Q&A

  • JPG화일을 SQL DB에 넣고 출력하기..
저의는 DB에 사진을 많이 넣어야 하는데요...

그 양이 많다보니 DB에 BMP를 넣기가 힘들어 졌어요...(메모리, 속도 때문...)

그래서 이제는 JPG로 입력을 할려고 하는데, 어떻게 해야할지..



많은 답변이 있지만, 잘 모르겠어요...

저의 DB서버는 MS-SQL이고요,, 입력해서 퀵리포트로 출력까지의 과정을 알려주시면 정말 감사하겠습니다.



BMP를 변환하는것이 아니고, 그냥 jpg화일을 넣고, 불러오고, 출력하고 싶습니다.

알려주세요...

벌써 1달째랍니다.

4  COMMENTS
  • Profile
    양용민 2000.12.13 18:38
    [제가 쓰고 있는 방법인데요. 그림화일을 MS-SQL서버의 Image 필드에 추가하는



    방법입니다. 밑에 소스는 웹서핑을 하다가 찾은 소스입니다. 보고 사용하세요.



    약간만 응용하시면 곧바로 사용하실수 있습니다. 그럼.





    Question/Problem/Abstract:



    How to get binary data in a workable format into or out of an MSSQL Image (Blob) field using ADO components.

    Answer:





    The main problem I faced when trying to do this was to deal with the fact that TField.Value returns a varOleStr no matter



    what was written into it, so the data needed to be converted into a more usable format.



    Note that there is no checking here that the TField is in fact of the correct type, and that the



    stream must be created and free-ed elsewhere manually. Also, additional memory equal to the size of the stream/blob is



    required, so be cautious if large amounts of data are involved.



    For ease of use in my own application, I incorporated this functionality into my descendent of TADOQuery.





    function 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 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;



    -------------------------------------------------------



    Examples:



    If you have an ADO query "qryBlobTest" with the following fields: nFileIcon: Image; nFileData: Image;



    // Store an icon in an Image field

    function StoreFileIcon: boolean;

    var

    AFileIcon: TIcon;

    MS: TMemoryStream;

    begin

    Result := false;

    AFileIcon := TIcon.Create;

    MS := TMemoryStream.Create;

    try

    AFileIcon.handle := ExtractAssociatedIcon('c:tempTest.doc'); // Pseudocode !!

    AFileIcon.SaveToStream(MS);

    Result := SaveToBlob(MS, qryBlobTest.FieldByName('nFileIcon'));

    finally

    AFileIcon.Free;

    MS.Free;

    end;

    end;



    // Load an icon from an Image field

    function LoadFileIcon: boolean;

    var

    AFileIcon: TIcon;

    MS: TMemoryStream;

    begin

    Result := false;

    AFileIcon := TIcon.Create;

    MS := TMemoryStream.Create;

    try

    if (LoadFromBlob(qryBlobTest.FieldByName('nFileIcon'), MS)) then begin

    AFileIcon.LoadFromStream(MS);

    // Do something with the Icon?

    Result := true;

    end;

    finally

    AFileIcon.Free;

    MS.Free;

    end;

    end;



    // Save a binary file in an Image field

    function StoreFileData: boolean;

    var

    FS: TFileStream;

    begin

    FS := TFileStream.Create('c:tempTest.doc', fmOpenRead);

    Result := SaveToBlob(FS, qryBlobTest.FieldByName('nFileData'));

    FS.Free;

    end;



    // Load a file from an Image field (save it to a file name)

    function LoadFileData: boolean;

    var

    FS: TFileStream;

    begin

    FS := TFileStream.Create('c:tempTest2.doc', fmCreate);

    LoadFromBlob(qryBlobTest.FieldByName('nFileData'), FS);

    FS.Free;

    end;

  • Profile
    김문석 2001.06.02 01:42
    님 덕분에 큰 고민거리 하나 해결 했네요 ^^



    복 많이 받으세요 ^^

  • Profile
    안나 2000.12.13 20:46
    죄송합니다만... 다시한번만 봐주세요...

    제가 코드를 응용하는것이 아직 부족해서....

    좀더 설명을 해주시면 안될까요...?

    예제라는 것을 하나 더 보내주시면 감사하겠습니다.



    너무 초보라서 죄송하군요...

  • Profile
    양용민 2000.12.13 22:21
    제 경우는 ADO사용한 경우이며 MSSQL서버의 필드 타입이 Image타입.



    그리고 저장된 image필드의 내용을 DBIMAGE 컴포넌트로 보여줄 경우 에러가 발생합니다.



    이것은 알고 계시지요. 왜냐... JPG 이니까. BMP는 괜찮은데.



    PS. ADO를 사용하시면 SQL서버에서 쿼리해 오는데 시간을 단축할 방법이 없나요?



    알고 계시면 답변 부탁드립니다. 저는 쿼리해 오는데 걸리는 시간때문에 1주일째



    고생하고 있는데 ADO를 버리고 BDE로 가야하나.



    단순한 SQL문장 ==>. " Select * From 고객 Order By 고객성명 " 인데 너무 느려요.



    방법을 알고 계시면 답변 부탁드립니다.



    //DB에서 그림화일 불러오기

    function 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;



    //그림화일을 DB에 집어 넣기.

    function 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;







    procedure TForm1.Button1Click(Sender: TObject);

    Var

    ImageFS: TFileStream;

    begin

    // DB에 있는그림을 AAA.JPG 화일로 생성

    ImageFS := TFileStream.Create('AAA.jpg', fmCreate);

    LoadFromBlob(AdoTable.FieldByName('약도'), ImageFS);

    ImageFS.Free;

    end;



    procedure TForm1.Button2Click(Sender: TObject);

    Var

    ImageFS: TFileStream;

    Begin

    //약도 필드에 AAA.JPG라는 그림화일 저장하기

    ImageFS := TFileStream.Create('AAA.jpg', fmOpenRead);

    AdoTable.Edit;

    SaveToBlob(ImageFS, AdoTable.FieldByName('약도'));

    AdoTable.Post;

    ImageFS.Free;

    end;



    • 퇴근하고싶다.
      2000.12.13 04:05
      급궁금 wrote: > StringGrid에서 0칼럼셀마다 체크박스를 어떤분이 올려주신 아래의 소스를 이용하여 > ...
    • 김진선
    • 2000.12.13 00:43
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 이수정
      2000.12.14 01:56
      저희는 이렇게 합니다.... 자기 그룹 안에 올라오는 컴포넌트들... form, groubbox, panel... 등등.. ...
    • 배인철
      2000.12.13 18:07
      김진선 wrote: > 제 컴은 윈도우2000서버를 쓰고요 델 버전은 5.0을 사용합니다. > 만드는 프로그램의 기...
    • 강인규
      2000.12.13 03:03
      폰트 설정하실때 언어인가? 그걸 한국어로 맞춰보셨나요? 98하고는 조금 다르게 나오지만 그래도 볼만은 ...
    • 초보자
      2000.12.13 02:02
      김진선 wrote: > 제 컴은 윈도우2000서버를 쓰고요 델 버전은 5.0을 사용합니다. > 만드는 프로그램의 기...
    • 손님
      2000.12.13 18:55
      종이학 wrote: > A프로그램에서 B프로그램을 실행하도록 했는데.. > ShellExecute(handle,'open',PChar('...
    • 최월자
    • 2000.12.12 22:59
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김종언
      2000.12.12 23:37
      님이 올리신 질문을 보니깐... inline view를 사용하고 있군요.. 그건 당근... 파라독스에선 사용할수가...
    • sonic0
    • 2000.12.12 22:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • sonic0
      2000.12.13 00:17
      sonic0 wrote: > 안녕하세요. > > 스트링 그리드를 이용한 퀵레포트 출력을 하려고 합니다. > > pre...
    • 이화
    • 2000.12.12 22:32
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 컴맹...
      2000.12.12 23:12
      꼭 콘솔이어야 합니까..? 델파이로 콘솔프로그램을 한다니... 델파이에서는 이렇게 처리하거든여... P...
    • 미나
    • 2000.12.12 22:22
    • 0 COMMENTS
    • /
    • 0 LIKES
    • kiwi
      2000.12.13 03:11
      곰탱이 wrote: > 윗버전에서 코딩한 프로그램을 아랫버전에서 다시 작업하고 실행히킬려면... > 다시말해...
    • 곰탱이
      2000.12.13 07:28
      kiwi wrote: > 곰탱이 wrote: > > 윗버전에서 코딩한 프로그램을 아랫버전에서 다시 작업하고 실행히킬려...
    • 류응철
      2000.12.16 22:25
      곰탱이 wrote: > kiwi wrote: > > 곰탱이 wrote: > > > 윗버전에서 코딩한 프로그램을 아랫버전에서 다...
    • 안나
    • 2000.12.12 20:50
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 양용민
      2000.12.13 18:38
      [제가 쓰고 있는 방법인데요. 그림화일을 MS-SQL서버의 Image 필드에 추가하는 방법입니다. 밑에 소스...
    • 김문석
      2001.06.02 01:42
      님 덕분에 큰 고민거리 하나 해결 했네요 ^^ 복 많이 받으세요 ^^
    • 안나
      2000.12.13 20:46
      죄송합니다만... 다시한번만 봐주세요... 제가 코드를 응용하는것이 아직 부족해서.... 좀더 설명을 해주...
    • 양용민
      2000.12.13 22:21
      제 경우는 ADO사용한 경우이며 MSSQL서버의 필드 타입이 Image타입. 그리고 저장된 image필드의 내용을 ...
    • 권경미
      2000.12.12 20:55
      델파이사랑 wrote: > 그냥..간단한 건데 잘안되네여.. > 디비에 있는 내용을 출력하는 건데..잘안돼서.....
    • 델파이사랑
      2000.12.12 21:32
      권경미 wrote: > 델파이사랑 wrote: > > 그냥..간단한 건데 잘안되네여.. > > 디비에 있는 내용을 출력...
    • 김태용
    • 2000.12.12 20:38
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 강인규
      2000.12.12 21:24
      왜 그런지는 모르겠지만 파라독스에서 날짜관련 쿼리가 타잎에러를 내는 경우가 많이 있습니다. 아주 머리...
    • 김태용
      2000.12.12 21:48
      강인규님 감사합니다 그렇해 하니까 잘되네요 5시간 작업을 해결해 주셨네요 어떻해 은혜를 갚어야 할...
    • 권경미
      2000.12.12 20:44
      김태용 wrote: > paradox에서 날짜가 코딩으로 해서 날짜가 입력이 안됩니다 > 어떻해 하면 돼죠? > >...
    • 김태용
      2000.12.12 21:05
      권경미 wrote: > 김태용 wrote: > > paradox에서 날짜가 코딩으로 해서 날짜가 입력이 안됩니다 > > 어...
    • 하데스
      2000.12.12 22:03
      case문이 이해가 되지 않는 모양인데... 쉽게 생각하시면 됩니다.. 같은 이름으로 tagTest를 3개 선언한...
    • 양병규
      2000.12.13 00:35
      가능합니다. 물론 델파이에 있는건 안되고... 다른놈을 쓰면됩니다. 자료실에 올려두지요... 그...
    • 김하늘
      2000.12.13 18:13
      감사합니다. 근데 이미지 삽입도 되나봐여.... 양병규 wrote: > 가능합니다. 물론 델파이에 있...
    • 권경미
      2000.12.12 20:18
      사발우성 wrote: > 안뇽 하신가여 고수님들 제가 마이다스에 관해서 질문좀 할라구 함다... > > 현재 ...
    • 김형준
      2001.04.27 09:42
      제가 사용해본결과 ClientDataSet에서는 table component 의 기능과 query component 의 기능 두가지가 ...