DAO의 CompactDatabase(), RepairDatabase() 함수 사용

Access 파일… mdb
요넘이 디스크 조각 모음을 하듯이 조각 모음을 해야 되는데
OLEDB에서 방법을 못 찾아서 DAO…를 가져다 쓰게 되었습니다.
헌데… CoInitializeEx() 함수를 AfxDaoInit()에서 호출하고 있어서
COM 쓰레드 모델을 지정할 수 없게 되어 있습니다. (참고로 MFC 프로젝트)


필요한 헤더 파일이나 라이브러리는 알아서 링크하시고
아래 소스는 Unicode용이니 MBCS에서 사용하려면 수정이 필요합니다.


COM 초기화를 하고 수행되는 함수로


Jet DB Engine을 생성해서
Repair, Compact를 수행하고, 결과로 나온 최종 파일을 기존 파일로 대체하는 소스 입니다.


OLEDB로 mdb 파일 쓰는 프로그램 작성시 Compact나 Repair가 필요할 경우 사용하세요…


참고사항1) mdb를 사용도중 컴퓨터가 tunr off 되거나 하면… repair를 해주는 게 좋습니다.
참고사항2) mdb는 사용하면 할 수록 파일 사이즈가 증가하고 내부 데이터가 조각이 나게 됩니다. 가끔 Compact를 안하면 느려집니다.
참고사항3) 아래 예제는 DAO 3.5를 사용합니다. 따라서 Acess 97 형식의 mdb 파일만 사용 가능합니다.
참고사항4) 아래 예제는 오류에 대한 예외처리가 없습니다.
참고사항5) 질문 안 받습니다. 알아서 연구하세요…

void MyDAOInit()
{
CString strDBFile;
strDBFile.LoadString(IDS_DB_FILENAME);
COleVariant varDBName(strDBFile, VT_BSTRT);

// DB compact & repair
CString strDBTmpFile = strDBFile + _T(“.tmp”);
COleVariant varTmpName(strDBTmpFile, VT_BSTRT);

// DAO DB Engine을 생성
GUID guidEngine; // DB Engine
guidEngine = IID_IDAODBEngineW; // for Unicode

COleVariant varKey; // DAO 3.5 and 3.6 runtime key
varKey = _T(“mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak”);

CLSID clsidEngine;
clsidEngine = CLSID35_CDAODBEngine; // Use DAO 3.5
// clsidEngine = CLSID_CDAODBEngine; // Use DAO 3.6

// DB Engine 생성
LPCLASSFACTORY2 pCF2;
::CoGetClassObject(clsidEngine, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory2, (LPVOID*)&pCF2);
DAODBEngine* dbengine;
pCF2->CreateInstanceLic( NULL, NULL, guidEngine, V_BSTR(&varKey), (LPVOID*)&dbengine);
pCF2->Release();

// RepairDatabase
dbengine->RepairDatabase(V_BSTR(&varDBName));

// Compact Database : defrag~~
long nOption = 0;
VARIANT _afxOptionalVariant = { VT_ERROR, 0, 0, 0, DISP_E_PARAMNOTFOUND };
dbengine->CompactDatabase(
V_BSTR(&varDBName), // Source File
V_BSTR(&varTmpName), // Destination File
COleVariant(/*dbLangGeneral*/dbLangKorean, VT_BSTRT), // Locale
COleVariant(nOption), // see CDaoWorkspace::CompactDatabase()
/*lpszPassword != NULL ? (VARIANT)COleVariant(lpszPassword, VT_BSTRT) : */_afxOptionalVariant // DB Password
);

// Release DAO DB Engine
dbengine->Release();

// rename : 덮어쓰기(MOVEFILE_REPLACE_EXISTING), 끝날때 까지 기다리기(MOVEFILE_WRITE_THROUGH)
MoveFileEx(strDBTmpFile, strDBFile, MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH);

}


[출처] DAO의 CompactDatabase(), RepairDatabase() 함수 사용|작성자 BS