Q&A

  • Table에 관한 질문입니다.
파이파이는 초보입니다.

상세한 답변 부탁드립니다.



질문> Table에서 Pack하는 방법이 있다고 하던데...

Delete로만 지우면 파일 용량이 줄어들지 않던데....



자료실에서 봤지만 자세하게 나오지 않아

초보인 저에게는 너무 어려워 이렇게 질문 올립니다.



자세한 답변 부탁드립니다.

이왕이면 예를 들수 있는 소스를 부탁드립니다.

2  COMMENTS
  • Profile
    s6763 2000.11.02 08:50
    파이파이 wrote:

    > 파이파이는 초보입니다.

    > 상세한 답변 부탁드립니다.

    >

    > 질문> Table에서 Pack하는 방법이 있다고 하던데...

    > Delete로만 지우면 파일 용량이 줄어들지 않던데....

    >

    > 자료실에서 봤지만 자세하게 나오지 않아

    > 초보인 저에게는 너무 어려워 이렇게 질문 올립니다.

    >

    > 자세한 답변 부탁드립니다.

    > 이왕이면 예를 들수 있는 소스를 부탁드립니다.





    procedure PackTable(Table: TTable);

    { This routine copied and modified from demo unit TableEnh.pas

    from Borland Int. }

    var

    { FCurProp holds information about the structure of the table }

    FCurProp: CurProps;

    { Specific information about the table structure, indexes, etc. }

    TblDesc: CRTblDesc;

    { Uses as a handle to the database }

    hDb: hDbiDB;

    { Path to the currently opened table }

    TablePath: array[0..dbiMaxPathLen] of Char;

    Exclusive: Boolean;

    begin

    if not Table.Active then _DBError(SDataSetClosed);

    Check(DbiGetCursorProps(Table.Handle, FCurProp));

    if StrComp(FCurProp.szTableType, szParadox) = 0 then begin

    { Call DbiDoRestructure procedure if PARADOX table }

    hDb := nil;

    { Initialize the table descriptor }

    FillChar(TblDesc, SizeOf(CRTblDesc), 0);

    with TblDesc do begin

    { Place the table name in descriptor }

    StrPCopy(szTblName, Table.TableName);

    { Place the table type in descriptor }

    StrCopy(szTblType, FCurProp.szTableType);

    bPack := True;

    bProtected := FCurProp.bProtected;

    end;

    { Get the current table's directory. This is why the table MUST be

    opened until now }

    Check(DbiGetDirectory(Table.DBHandle, False, TablePath));

    { Close the table }

    Table.Close;

    try

    { NOW: since the DbiDoRestructure call needs a valid DB handle BUT the

    table cannot be opened, call DbiOpenDatabase to get a valid handle.

    Setting TTable.Active = False does not give you a valid handle }

    Check(DbiOpenDatabase(nil, szCFGDBSTANDARD, dbiReadWrite, dbiOpenExcl, nil,

    0, nil, nil, hDb));

    { Set the table's directory to the old directory }

    Check(DbiSetDirectory(hDb, TablePath));

    { Pack the PARADOX table }

    Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, False));

    { Close the temporary database handle }

    Check(DbiCloseDatabase(hDb));

    finally

    { Re-Open the table }

    Table.Open;

    end;

    end

    else if StrComp(FCurProp.szTableType, szDBase) = 0 then begin

    { Call DbiPackTable procedure if dBase table }

    Exclusive := Table.Exclusive;

    Table.Close;

    try

    Table.Exclusive := True;

    Table.Open;

    try

    Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, nil, True));

    finally

    Table.Close;

    end;

    finally

    Table.Exclusive := Exclusive;

    Table.Open;

    end;

    end

    else DbiError(DBIERR_WRONGDRVTYPE);

    end;

  • Profile
    코끼리 2000.11.02 00:23
    만약 오라클 for Server를 쓰신다면 Truncate 명령이 있는데...

    글쎄요

    질문하신 내용이 무언지 몰라 죄송합니다.







    파이파이 wrote:

    > 파이파이는 초보입니다.

    > 상세한 답변 부탁드립니다.

    >

    > 질문> Table에서 Pack하는 방법이 있다고 하던데...

    > Delete로만 지우면 파일 용량이 줄어들지 않던데....

    >

    > 자료실에서 봤지만 자세하게 나오지 않아

    > 초보인 저에게는 너무 어려워 이렇게 질문 올립니다.

    >

    > 자세한 답변 부탁드립니다.

    > 이왕이면 예를 들수 있는 소스를 부탁드립니다.