Q&A

  • 인덱스까지 똑같은 DB생성하는법 좀 알려주세요. 정말 급합니다.
프로그램 실행중에 똑같은 DB를 생성해야하는데 필드형식하고 레코드값은 똑같이 생성이 되지만 인덱스는 복사가 되지 않습니다.



BatchMove 컴포넌트를 사용하면 된다고 책에 기입이 되어 있어서 아래와 같이 코딩을 했습니다. 먼저 Table1에는 복사할 DB를 연결하고, Table2에는 복사될 위치와 파일명을 실행시에 입력하도록 했습니다.

Batchmove1의 Source 속성에는 Table1을 Destination속성에는 Table2를 입력하고

Batchmove1의 Move속성값은 batCopy와 batAppend를 번갈아 가며 해보았습니다.



Procedure TForm.Button1Click(Sender:TObject);

begin



Table2.Databasename:='엘리어스명';

Table2.Tablename:='파일명';



Table2.FieldDefs:=Table1.FieldDefs;

Table2.IndexDefs.Assign(Table1.IndexDefs);

Table2.CreateTable;

Table2.Open;

BatchMove1.Execute;



end;



무엇이 잘못된건지 잘 모르겠습니다. 위의 방법이 인덱스까지 복사할 수 없다면 다른방법좀 알려주십시요. 오늘 하루 종일 붙잡고 이책저책 찾아보느라 정말 힘들었습니다.

아시는 분께서 알려주시면 정말 고맙겠습니다.

그럼 이만....

4  COMMENTS
  • Profile
    김영대 1999.10.30 20:37
    임형호 wrote:

    > 프로그램 실행중에 똑같은 DB를 생성해야하는데 필드형식하고 레코드값은 똑같이 생성이 되지만 인덱스는 복사가 되지 않습니다.

    >

    > BatchMove 컴포넌트를 사용하면 된다고 책에 기입이 되어 있어서 아래와 같이 코딩을 했습니다. 먼저 Table1에는 복사할 DB를 연결하고, Table2에는 복사될 위치와 파일명을 실행시에 입력하도록 했습니다.

    > Batchmove1의 Source 속성에는 Table1을 Destination속성에는 Table2를 입력하고

    > Batchmove1의 Move속성값은 batCopy와 batAppend를 번갈아 가며 해보았습니다.

    >

    > Procedure TForm.Button1Click(Sender:TObject);

    > begin

    >

    > Table2.Databasename:='엘리어스명';

    > Table2.Tablename:='파일명';

    >

    > Table2.FieldDefs:=Table1.FieldDefs;

    > Table2.IndexDefs.Assign(Table1.IndexDefs);

    > Table2.CreateTable;

    > Table2.Open;

    > BatchMove1.Execute;

    >

    > end;

    >

    > 무엇이 잘못된건지 잘 모르겠습니다. 위의 방법이 인덱스까지 복사할 수 없다면 다른방법좀 알려주십시요. 오늘 하루 종일 붙잡고 이책저책 찾아보느라 정말 힘들었습니다.

    > 아시는 분께서 알려주시면 정말 고맙겠습니다.

    > 그럼 이만....



    말씀하신 것처럼 TBatchMove 는 index 를 복사해주지 않습니다

    그대신 BDE 함수인 DbiCopyTable() 를 사용해 보세요

    그리고 index가 깨졌는지 의심이 가시면 아래처럼 index를 다시 만들어 보세요

    Table.Open;

    Check(DBIRegenIndexes(Table.Handle));

    Table.Close;





  • Profile
    임형호 1999.10.30 23:19
    김영대 wrote:

    > 임형호 wrote:

    > > 프로그램 실행중에 똑같은 DB를 생성해야하는데 필드형식하고 레코드값은 똑같이 생성이 되지만 인덱스는 복사가 되지 않습니다.

    > >

    > > BatchMove 컴포넌트를 사용하면 된다고 책에 기입이 되어 있어서 아래와 같이 코딩을 했습니다. 먼저 Table1에는 복사할 DB를 연결하고, Table2에는 복사될 위치와 파일명을 실행시에 입력하도록 했습니다.

    > > Batchmove1의 Source 속성에는 Table1을 Destination속성에는 Table2를 입력하고

    > > Batchmove1의 Move속성값은 batCopy와 batAppend를 번갈아 가며 해보았습니다.

    > >

    > > Procedure TForm.Button1Click(Sender:TObject);

    > > begin

    > >

    > > Table2.Databasename:='엘리어스명';

    > > Table2.Tablename:='파일명';

    > >

    > > Table2.FieldDefs:=Table1.FieldDefs;

    > > Table2.IndexDefs.Assign(Table1.IndexDefs);

    > > Table2.CreateTable;

    > > Table2.Open;

    > > BatchMove1.Execute;

    > >

    > > end;

    > >

    > > 무엇이 잘못된건지 잘 모르겠습니다. 위의 방법이 인덱스까지 복사할 수 없다면 다른방법좀 알려주십시요. 오늘 하루 종일 붙잡고 이책저책 찾아보느라 정말 힘들었습니다.

    > > 아시는 분께서 알려주시면 정말 고맙겠습니다.

    > > 그럼 이만....

    >

    > 말씀하신 것처럼 TBatchMove 는 index 를 복사해주지 않습니다

    > 그대신 BDE 함수인 DbiCopyTable() 를 사용해 보세요

    > 그리고 index가 깨졌는지 의심이 가시면 아래처럼 index를 다시 만들어 보세요

    > Table.Open;

    > Check(DBIRegenIndexes(Table.Handle));

    > Table.Close;

    >

    > 답변 잘 보았습니다. 그런데 제가 아직 초보라서 그런지 위의 구문을 사용할 수 가 없습니다. 영문메뉴엘을 보았는데도 자꾸 에러가 뜨는군요.. 죄송하지만 사용법을 좀 자세히 알려주시면 고맙겠습니다.

  • Profile
    이재식 1999.10.31 00:11
    이재식 Wrote :

    안녕하세요?

    김영대님께서 말씀하신대로 BatchMove는 필드 및 데이터 이동뿐

    인덱스까지는 해주질 않아요.



    이문제는 2가지 방법으로 풀 수 있습니다.

    방법1 :

    with Table2 do

    begin

    Active := false ;

    DataBaseName := 'DBDEMOS' ;

    TableName := 'newTable' ;

    TableType := ttParadox ;

    FieldDefs.Assign (Table1.FieldDefs);

    Table1.IndexDefs.Update ; // 중요

    IndexDefs.Assign(Table1.IndexDefs) ;

    CreateTable ;

    Open ;

    end ;



    이렇게한다음 귀하께서 하신대로 BatchMove를 하여 데이터를 이동시키는거죠.



    방법2 : 김영대님께서 말씀하신 BDE함수는 쓰는거죠.

    먼저 uses절에 DBiProcs를 반드시 추가해야 합니다.

    그리고 이렇게 하세요.

    var

    DBH : HDbIDB ;

    begin

    DBH := DataBase1.Handle ;

    Check(DbiCopyTable(DBH, True,PChar('t1.db'),nil,PChar('newtable.db')));

    end;



    이렇게 하시면 t1테이블의 필드 및 인덱스, 데이터까지 newTable.db로

    이동됩니다.

    중요한것은 확장자까지 써야 한다는 것입니다(.db까지)

    로컬일경우에는 필수로 되어있다고 메뉴얼에 있네요.



    그럼...

  • Profile
    김영대 1999.10.31 00:09
    // TBatchMove 는 index 를 복사해주지 않습니다

    // 그대신 BDE 함수인 DbiCopyTable() 를 사용하면 됩니다

    // 하지만 이 함수도 드라이버가 틀리면 사용할 수 없습니다

    // 함수의 사용예

    // DbiCopyTable(Table1.DBHandle, 'CUSTOMER.DB', nil, 'CUSTOMER2.DB');



    // 그리고 index가 깨졌는지 의심이 가시면 아래처럼 index를 다시 만들어 보세요

    // Table.Open;

    // Check(DBIRegenIndexes(Table.Handle));

    // Table.Close;



    function CopyTable(tbl: TTable; dest: string): boolean;

    var

    psrc, pdest: array[0..DBIMAXTBLNAMELEN] of char;

    rslt: DBIResult;

    begin

    Result := False;

    StrPCopy(pdest, dest);

    with tbl do

    begin

    try

    DisableControls;

    StrPCopy(psrc, TableName);

    rslt := DbiCopyTable(DBHandle, True, psrc, nil, pdest);

    Result := (rslt = 0);

    finally

    Refresh;

    EnableControls;

    end;

    end;

    end;