하루 종일 여기 저기 찾아 봤습니다.
다음과 같은 방법으로 해서 해결했습니다.
다음 사이트에서 방법을 찾았습니다.
http://borland.xportal.ru/forum/viewtopic.php?t=9585
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant JetEng;
AnsiString SourceFileName = "YahoAutobi.mdb", TargetFileName="Temp.mdb";
JetEng = CreateOleObject("JRO.JetEngine");
WideString InputDB = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + SourceFileName;
WideString OutputDB = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + TargetFileName;
JetEng.OleFunction("CompactDatabase",InputDB,OutputDB);
if (DeleteFile(SourceFileName)== false) ShowMessage("파일을 지울 수 없음");
if (RenameFile(TargetFileName, SourceFileName) == false)
ShowMessage("파일이름을 바꿀 수 없음");
JetEng = Unassigned;
}
김상구.패패루 님이 쓰신 글 :
: 일단, MDB압축에 대한 코드는 저도 입수를 했는데, 제 컴에선 잘 안되더군요.
: 그래서 관련된 정보들을 추적하다가 MS측에서 답변한 것을 봤는데.. 오래되서
: 잘 기억은 안나지만, 요점은 '어쩔 수 없다' 였던걸로 기억합니다.
: 일단 한 번 시도해 보심이 좋을 것 같습니다.
:
:
: bool __fastcall PackMDB(AnsiString &mdbFileName)
: {
: Variant db;
: AnsiString tempFile;
:
: try
: {
: Screen->Cursor = crSQLWait ;
: db = Variant::CreateObject("DAO.DBEngine.30");
: try
: {
: tempFile = ExtractFilePath(mdbFileName) + "\\msaTemp.mdb";
: db.OleFunction("CompactDataBase", mdbFileName, tempFile);
: DeleteFile(mdbFileName);
: RenameFile (tempFile,mdbFileName);
: }
: catch(EOleException &e)
: {
: ShowMessage(e.Message);
: return false;
: }
: }
: __finally
: {
: db = Unassigned;
: Screen->Cursor = crDefault ;
: }
: return true;
: }
:
: 제 경우 에러가 나는 위치는
: db = Variant::CreateObject("DAO.DBEngine.30");
: 여기입니다.
: 분명 다 설치되어 있고, 레지스트리에서도 확인할 수 있는데 클래스에 대한
: 허가가 없다는 아주 황당한 에러를 보여줍니다.
: 이 문제에 대한 MS의 답변은.. 어쩔 수 없으니까 자기네들이 만든 Pack 유틸
: 을 쓰라는.. 거였습니다. exe로 된 파일이더군요.
: 그 유틸은 저도 어디다 짱박아놨는지 잘 모르겠구요.. ^^;;
:
: MDB는 ISAM을 쓰는 것으로 알고 있는데, 말씀하신 사이즈가 계속 커지는 문
: 제가 좀 고민스럽죠.. 차라리 Fox나 dBase에서 쓰던 dbf는.. INSERT할 때
: Deleted된 레코드를 찾아서 그 위치에 엎어쓰고, Deleted마크를 풀어주면
: 크기 변화를 최소화 하면서 관리할 수 있는데 MDB에서는 그것도 잘 안되더라
: 구요.. 암튼, 혹시 저와 같은 문제를 접하셨다면, 그리고 해결하셨다면
: 제게도 좀 알려주시면 고맙겠습니다.
:
: 그리고.. ODBC timeout걸리는 문제는.. 2초씩 쿼리하는건 좀 심하지 않나요?
: ^^
: 아무리 polling시스템이라고 해도 2초는 좀 어렵던데..
: 저도 사이베이스랑 할 때 2초로 걸었다가 DB서버에 부하 엄청 걸리고 블러킹
: 되고 난리나서 30초로 조종했거든요. ^^
:
: 요즘엔 ODBC 안쓰고 ADO를 써서 작업하는데 제 경우엔 쓰레드로 작업한 후
: 쓰레드 종료시점에서 다시 타이머를 걸거나.. 비동기로 처리합니다.
:
: 어느 하나 명확한 답이 없네요.. 애구 쑥스러워랑.. ^^a
:
:
: 경호 님이 쓰신 글 :
: : 음 간만에 질답란에 글을 쩝....
: :
: : ODBC로 Access의 MDB파일을 연결 했습니다.
: : 음 그리고 데이터를 집어넣구 빼구 하다보면 실제 MDB안에 데이터는 하나두 없어두
: : 파일의 크기는 처음크기로 복구되지 않고 있습니다.
: :
: : 일단 그건 물리적 레코드셋의 정보들을 기억하고 있어서 그런줄은 알고 있지만
: : 파일의 레코드셋들을 재정렬해서 인덱스값들을 초기로 돌려놓기 위해 복구 또는 압축을 해야 하는데
: : ODBC의 경우에 옵션안에는 복구모드가 있어서 할수 있지만 프로그램상에서는 방법을 못찿았습니다.
: :
: : 혹시 프로그램 상에서 MDB파일을 복구할수 있는 방법을 아시는 분은 좀 가르쳐주세요 ^^;
: : DAO로 하는 경우야 알고 있기는 한데 DAO자체의 한계성 때문에 프로그램에서 쓰기는 힘들겠더군요
: :
: : 질문을 정리하자면 ODBC를 사용하여 MDB를 연결해서 사용할 경우 프로그램 상에서 MDB파일을
: : 압축하거나 복구하는 방법은 무엇입니까 예요 ^^:
: :
: : 그리고 한가지 더 ^^;
: :
: : ODBC를 사용하는 경우 쿼리를 2초당 한번씩 할경우 어느 순간에 가서 ODBC에 넘겨진 쿼리가 timeout
: : 이 걸려서 블럭이 생기는 경우가 있는데 혹시 이런 경우를 당해 보신분 있나여 ^^:
: : 이에 대한 해결책을 아시는 분도 리플 달아 주세요 ...
: :
: :