Secreta

MS-SQL Image field를 사용하여 그림을 저장하자 본문

Engineering/Technique

MS-SQL Image field를 사용하여 그림을 저장하자

준♡ 2010.03.30 08:29

네이버 블로그의 자료 옮겨오기 프로젝트 제 4탄, 이제 이 작업도 슬슬 마무리가 되는군요

(애시당초 저의 네이버 블로그는 ... 황무지였지만요)

원문은 -->> http://blog.naver.com/reinliebe/120045909143 에서 확인하실 수 있습니다만,

정리를 마치는 대로 네이버 블로그는 폐쇄 예정입니다.

 

MS-SQL 에는 Image field가 존재하며 이는 0~2^(31)-1 bytes를 저장 할 수 있는 필드입니다.

 

 

하지만 이 필드는 데이터를 읽고 쓰기가 다른 데이터 형식에 비해 조금 까다롭습니다.

 

MS-SQL의 Image field 뿐만 아니라 Dao 등의 OLE 개체 필드도 유사한 방법을 사용합니다.

 

데이터 형식이 image인 필드는 ODBC에서는 CLongBinary 형식으로 바뀝니다.
(Dao 등의 OLE 개체 필드도 CLongBianry 형식으로 바뀜.)


 

CLongBinary Class에는 다음과 같은 멤버변수와 함수들을 포함하고 있습니다.

 

 

이 중에 m_dwDataLength와 m_hData에 넣고자 하는 데이터를 넣어주면 DB에 정보가 입력됩니다.

m_dwDataLength는 넣고자 하는 데이터의 크기 정보를,

m_hData에는 넣고자 하는 데이터의 핸들 정보를 넣어주면 됩니다.

 

1. ODBC 설정 및 Class 등록... 은 아래 포스트에 있습니다.

2. Database 변수 만들기
    저는 보통 CxxxDlg 에서 작업을 하기 때문에 CxxxDlg에서 데이터베이스를 사용할 예정입니다.
    CxxxDlg의 클래스 정의 부분에 사용할 Database Class의 변수를 등록합니다.

 

3. DB에 저장하기.

CFile fileImage;

CFileStatus fileStatus;

m_db.Open();                                                 // DB를사용하기위해

DB Open m_db.AddNew();                                       // DB에새로운열을추가함

fileImage.Open("test1.jpg", CFile::modeRead);                // 저장할파일을불러옵니다

fileImage.GetStatus(fileStatus);

m_db.m_image.m_dwDataLength = fileStatus.m_size;

HGLOBAL hGlobal = GlobalAlloc(GPTR,fileStatus.m_size);

m_db.m_image.m_hData = GlobalLock(hGlobal);

fileImage.ReadHuge(m_db.m_image.m_hData,fileStatus.m_size);

m_db.SetFieldDirty(&m_db.m_image);

m_db.SetFieldNull(&m_db.m_image,FALSE);

m_db.Update();                                               // DB에정보를저장하고닫습니다

m_db.Close();

 

직접 실행을 하면 다음과 같습니다.

[코드]

[결과]

 

그림은 이진데이터로 들어가고 ODBC Test 라는 문자열이 입력되어 있음을 확인 할 수 있습니다.

 

(이전 블로그 reinliebe.textcube.com의 서비스 종료와 더불어 원문을 그대로 옮겨옵니다)

0 Comments
댓글쓰기 폼