윈도우 98/ 델파이3을 사용하고 있습니다.
DB는 파라독스를 사용하구요
DB 파일이 있는 디렉토리를 다른 디렉토리에 백업을 받은 후
그 백업 디렉토리에 있는 DB 파일을 SELECT 하여 INSERT하려고 합니다.
왜냐하면 테이블이 바뀌어서 새로운 테이블을 원래 디렉토리에 넣구 말입니다.
그런데 몇번 이 실행파일을 실행시키면 자꾸 에러가 나구 해서요...
'corrupt ~.px ... ' 등 DB 인덱스가 깨져서 그런건지 확실히 잘 모르겠어서요..
예로 소스를 올리겠습니다. 간단하게 하나의 테이블에 관한 것만 올리겠습니다.
procedure TForm1.FormCreate(Sender: TObject);
begin
table1.Open;
Query4.Close;
Query4.Open;
if table1.IsEmpty then begin
end
else begin
while not Query4.EOF do begin
table1.Delete;
if table1.IsEmpty then
exit;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.Open;
while Not Query1.EOF do begin
table1.Insert;
table1.FieldByName('Busi_cd').AsString := Query1.FieldByName('Busi_cd').AsString;
table1.FieldByName('Busi_nm').AsString := Query1.FieldByName('Busi_nm').AsString;
table1.FieldByName('Busi_type').AsString := Query1.FieldByName('Busi_type').AsString;
table1.FieldByName('city_nm').AsString := Query1.FieldByName('city_nm').AsString;
table1.FieldByName('Gu_nm').AsString := Query1.FieldByName('Gu_nm').AsString;
table1.FieldByName('Dong_nm').AsString := Query1.FieldByName('Dong_nm').AsString;
table1.FieldByName('Addr_etc').AsString := Query1.FieldByName('Addr_etc').AsString;
table1.FieldByName('Buy_ck').AsString := Query1.FieldByName('Buy_ck').AsString;
table1.FieldByName('president').AsString := Query1.FieldByName('president').AsString;
table1.FieldByName('In_Reserv1').AsString := Query1.FieldByName('In_Reserv1').AsString;
table1.FieldByName('In_Reserv2').AsString := Query1.FieldByName('In_Reserv2').AsString;
table1.FieldByName('Tel_no').AsString := Query1.FieldByName('Tel_no').AsString;
table1.FieldByName('Fax_no').AsString := Query1.FieldByName('Fax_no').AsString;
table1.FieldByName('Zip_code').AsString := Query1.FieldByName('Zip_code').AsString;
table1.FieldByName('Credit_Grade').AsString := Query1.FieldByName('Credit_Grade').AsString;
table1.FieldByName('Establish_dt').AsString := Query1.FieldByName('Establish_dt').AsString;
table1.FieldByName('Cust_kind').AsString := Query1.FieldByName('Cust_kind').AsString;
table1.FieldByName('Dept').AsString := Query1.FieldByName('Dept').AsString;
table1.FieldByName('Order_Nm').AsString := Query1.FieldByName('Order_Nm').AsString;
table1.FieldByName('Birthday').AsString := Query1.FieldByName('Birthday').AsString;
table1.FieldByName('Birthday_type').AsString := Query1.FieldByName('Birthday_type').AsString;
table1.FieldByName('Marriage').AsString := Query1.FieldByName('Marriage').AsString;
table1.FieldByName('sys_date').AsString := Query1.FieldByName('sys_date').AsString;
table1.Post;
Query1.Next;
end;
Showmessage('Data 변환이 모두 되었습니다.');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Query1.Close;
table1.Close;
Close;
end;
이상이 소스구요.. 참고로 테이블은 한 34 정도가 되는 듯 싶군요..
SELECT 할 Query1 컴포넌트의 DatabaseName은 원래 DB가 존재하는 디렉토리로 설정했구요.
INSERT 할 Table1 컴포넌트의 DatabaseName은 백업받아 놓은 디렉토리로 설정했습니다.
그럼 고수님들의 답변을 기다리겠습니다..
파라독스는 잘 써보지를 않아서요.. 프로그램 업그레이드 하기가 어렵네요...
그럼 꾸벅.
>
> 윈도우 98/ 델파이3을 사용하고 있습니다.
>
> DB는 파라독스를 사용하구요
>
> DB 파일이 있는 디렉토리를 다른 디렉토리에 백업을 받은 후
>
> 그 백업 디렉토리에 있는 DB 파일을 SELECT 하여 INSERT하려고 합니다.
>
> 왜냐하면 테이블이 바뀌어서 새로운 테이블을 원래 디렉토리에 넣구 말입니다.
>
> 그런데 몇번 이 실행파일을 실행시키면 자꾸 에러가 나구 해서요...
>
> 'corrupt ~.px ... ' 등 DB 인덱스가 깨져서 그런건지 확실히 잘 모르겠어서요..
>
> 예로 소스를 올리겠습니다. 간단하게 하나의 테이블에 관한 것만 올리겠습니다.
>
> procedure TForm1.FormCreate(Sender: TObject);
> begin
>
> table1.Open;
> Query4.Close;
> Query4.Open;
>
> if table1.IsEmpty then begin
> end
> else begin
> while not Query4.EOF do begin
> table1.Delete;
> if table1.IsEmpty then
> exit;
> end;
> end;
>
> end;
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
>
> Query1.Close;
>
> Query1.Open;
>
>
> while Not Query1.EOF do begin
> table1.Insert;
> table1.FieldByName('Busi_cd').AsString := Query1.FieldByName('Busi_cd').AsString;
> table1.FieldByName('Busi_nm').AsString := Query1.FieldByName('Busi_nm').AsString;
> table1.FieldByName('Busi_type').AsString := Query1.FieldByName('Busi_type').AsString;
> table1.FieldByName('city_nm').AsString := Query1.FieldByName('city_nm').AsString;
> table1.FieldByName('Gu_nm').AsString := Query1.FieldByName('Gu_nm').AsString;
> table1.FieldByName('Dong_nm').AsString := Query1.FieldByName('Dong_nm').AsString;
> table1.FieldByName('Addr_etc').AsString := Query1.FieldByName('Addr_etc').AsString;
> table1.FieldByName('Buy_ck').AsString := Query1.FieldByName('Buy_ck').AsString;
> table1.FieldByName('president').AsString := Query1.FieldByName('president').AsString;
> table1.FieldByName('In_Reserv1').AsString := Query1.FieldByName('In_Reserv1').AsString;
> table1.FieldByName('In_Reserv2').AsString := Query1.FieldByName('In_Reserv2').AsString;
> table1.FieldByName('Tel_no').AsString := Query1.FieldByName('Tel_no').AsString;
> table1.FieldByName('Fax_no').AsString := Query1.FieldByName('Fax_no').AsString;
> table1.FieldByName('Zip_code').AsString := Query1.FieldByName('Zip_code').AsString;
> table1.FieldByName('Credit_Grade').AsString := Query1.FieldByName('Credit_Grade').AsString;
> table1.FieldByName('Establish_dt').AsString := Query1.FieldByName('Establish_dt').AsString;
> table1.FieldByName('Cust_kind').AsString := Query1.FieldByName('Cust_kind').AsString;
> table1.FieldByName('Dept').AsString := Query1.FieldByName('Dept').AsString;
> table1.FieldByName('Order_Nm').AsString := Query1.FieldByName('Order_Nm').AsString;
> table1.FieldByName('Birthday').AsString := Query1.FieldByName('Birthday').AsString;
> table1.FieldByName('Birthday_type').AsString := Query1.FieldByName('Birthday_type').AsString;
> table1.FieldByName('Marriage').AsString := Query1.FieldByName('Marriage').AsString;
> table1.FieldByName('sys_date').AsString := Query1.FieldByName('sys_date').AsString;
>
> table1.Post;
>
> Query1.Next;
> end;
>
> Showmessage('Data 변환이 모두 되었습니다.');
>
> end;
>
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> Query1.Close;
> table1.Close;
>
> Close;
>
> end;
>
> 이상이 소스구요.. 참고로 테이블은 한 34 정도가 되는 듯 싶군요..
>
> SELECT 할 Query1 컴포넌트의 DatabaseName은 원래 DB가 존재하는 디렉토리로 설정했구요.
> INSERT 할 Table1 컴포넌트의 DatabaseName은 백업받아 놓은 디렉토리로 설정했습니다.
>
>
> 그럼 고수님들의 답변을 기다리겠습니다..
>
> 파라독스는 잘 써보지를 않아서요.. 프로그램 업그레이드 하기가 어렵네요...
>
> 그럼 꾸벅.
>
>
특정한 테이블의 인덱스가 깨진상태로 보입니다.
자료실에보면 인덱스 복구하는 유틸리티가 있습니다.
복구후 다시 실행하여 보십시요.
<참고>
일반적인 백업방식은 아니라고 봅니다.
차라리 데이타디렉토리 전체를 압축하는 것이 어떨까요.
파일압축콤포넌트를 사용하여 쓰신다면 쉽게 구현이 됩니다.
위 방법시 한가지 주의해야할 것은 프로그램 종료를 시키고
백업 및 복원프로그램을 돌려야 합니다.
그렇지 않으로 파일이 오픈된상태라 읽지를 못하고 그냥 넘어가
완벽한 백업파일을 구축할 수 없답니다.
아래는 Zipmaster라는 압축콤포넌트를 사용하여 백업및복원하는
루틴입니다. 참고가 된다면 ...
<백업>
ZipMaster1.DLLDirectory := ExtractFilePath(Application.ExeName);
ZipMaster1.Load_Zip_Dll;
ZipMaster1.Load_Unz_Dll;
ZipMaster1.ZipFilename := ExtractFilePath(Application.ExeName)+'backup'+
'b'+FormatDateTime('yyyymmdd', now)+'.zip';
ZipMaster1.FSpecArgs.Add(ExtractFilePath(Application.ExeName)+'temp*.*');
ZipMaster1.Add;
ZipMaster1.Unload_Zip_Dll;
ZipMaster1.Unload_Unz_Dll;
FileListBox1.Update;
Screen.Cursor := Old;
MessageDlg('데이타 백업완료!!!', mtInformation, [mbOk], 0);
<복원>
ZipMaster1.DLLDirectory := ExtractFilePath(Application.ExeName);
ZipMaster1.Load_Zip_Dll;
ZipMaster1.Load_Unz_Dll;
ZipMaster1.ExtrBaseDir := ExtractFilePath(Application.ExeName)+'data';
ZipMaster1.ZipFilename := Edit1.text;
ZipMaster1.ExtrOptions := [ExtrOverWrite];
ZipMaster1.Extract;
MessageDlg('데이타 복원완료!!!', mtInformation, [mbOk], 0);
ZipMaster1.Unload_Zip_Dll;
ZipMaster1.Unload_Unz_Dll;