C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[21379] Re:ODBC로 연결된 MDB파일의 압축이나 복구방법 아시는 분 ^^;
김상구.패패루 [peperu] 1649 읽음    2002-09-11 19:01
일단, 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
: 이 걸려서 블럭이 생기는 경우가 있는데 혹시 이런 경우를 당해 보신분 있나여 ^^:
: 이에 대한 해결책을 아시는 분도 리플 달아 주세요 ...
:
:

+ -

관련 글 리스트
21360 ODBC로 연결된 MDB파일의 압축이나 복구방법 아시는 분 ^^; 경호 1422 2002/09/10
21379     Re:ODBC로 연결된 MDB파일의 압축이나 복구방법 아시는 분 ^^; 김상구.패패루 1649 2002/09/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.