본문 바로가기
프로그래밍/PowerBuilder

db에 사진을 저장하고 불러오는 방법

by MAKING_ 2020. 10. 31.
반응형

그림을 저장할 컬럼타입은 SQL AnyWhere를 사용하신다면
long binary 로 지정해 주시면 됩니다.(오라클은 long law)

integer li_FileNum, loops, i
long flen, bytes_read
blob b, Emp_pic

// 커서를 모래시계로
SetPointer(HourGlass!)

// 오픈할 파일의 크기를 얻는다.
flen = FileLength("c:\emp_100.bmp")
// 스트림모드로 파일을 연다.
li_FileNum = FileOpen("c:\emp_100.bmp",  &
StreamMode!, Read!, LockRead!)

IF li_FileNum = -1 THEN
  MessageBox('알림', '파일열기 에러입니다.')
  RETRUN
END IF

// 파일이 32765 byte보다 클시에 몇번을 나누어 읽을 것인지 결정한다.
IF flen > 32765 THEN
IF Mod(flen, 32765) = 0 THEN
loops = flen/32765
ELSE
loops = (flen/32765) + 1
END IF
ELSE
loops = 1
END IF

// loop 수만큼 파일을 읽는다.
FOR i = 1 to loops
    bytes_read = FileRead(li_FileNum, b)
    Emp_pic = Emp_pic + b
NEXT

//파일을 닫는다.
FileClose(li_FileNum)

//테이블에 저장한다.
UPDATEBLOB 테이블명
      SET 그림컬럼명 = :Emp_pic
    WHERE Emp_num = 100 ;

COMMIT  ;


사진이나 용량이 큰 파일등은 blob 으로 저장을 하는데
blob은 일반적인 update명령으로는 저장이 되지 않으므로
위 처럼 저장을 합니다.
저장할 row의 키값은(위의 경우 사번(emp_num)) 은 미리
저장을 해놓고 그림만 다시 저장을 해주는 형태입니다.
file read시 stream mode는 32765 byte씩 밖에
못 읽어 오므로 이보다 클시 위처럼 여러번 잘라서
읽어야 합니다.

다시 읽어올때는 selectblob을 이용하시면 됩니다.

Blob Emp_pic

SELECTBLOB 그림컬럼명
INTO :Emp_pic
FROM 테이블명
WHERE Emp_Num = 100 ;
p_1.SetPicture(Emp_pic)

반응형

댓글