2011-03-24 2 views
2

ADOConnection 및 AdoTable을 사용하여 이전 dBase 데이터베이스에서 일부 정보를 복사해야합니다. 나는 모든 테이블을 열 수 있어요하지만 난 1.01 GB를 큰 테이블을 열하는 동안 데이터 공급자 나 기타 서비스 가 E_FAIL 상태dBase 테이블 열기

을 반환

이 예외를 얻을 수 (1 093 588 624 바이트) . 성능이 매우 좋지 않습니다. 이것은 내가 TADOConnection와 CursorLocation에 대한 기본 설정 clUseClient이라고 생각 연결 문자열

ConnectionString:=Format('Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s;Extended Properties=dBase IV;',[path]) 
+0

저는 더 이상 사용되지 않지만 BDE를 사용하여 열어 보았습니까? –

답변

4

입니다. 이 설정을 사용하면 클라이언트가 전체 데이터 세트를 메모리로 읽어옵니다. 그것은 느린 것을 설명하고 오류를 설명 할 수 있습니다.

clUseServer으로 변경해보십시오.

ADOConn.CursorLocation := clUseServer; 

또는 개체 속성 속성에서 변경할 수 있습니다.

+0

clUseServer로 변경하면 'Index not found'가 표시됩니다 !!! – Najem

+0

@Najem : 업데이트를 할 수있는 기본 키를 찾고있을 수 있습니다. 난 그냥 여기에 추측이지만 테이블 (아마도 ctKeyset 또는 ctStatic)에 다른 커서 유형을 시도해보십시오. –

+0

커서 유형을 clUseServer로 변경 한 후에 성능이 향상되었습니다. 그리고 5746353 레코더 전체에 – Najem

-1

TAdoConnection에 여전히 문제가있는 경우 Apollo을 제안합니다. 이것은 다양한 테이블 유형 (Clipper NTX, Foxpro CDX)을 지원합니다.

+0

이로드되었지만 DBase IV MDX가 아닙니다. –

4

머리글에 자동 열기 (.MDX) 인덱스 플래그가 있지만 인덱스가 데이터베이스에없는 것 같습니다.

시도해 볼 수 있습니다. 데이터베이스 헤더에서 해당 autoopen 플래그를 지 웁니다. 데이터베이스 복사본을 테스트하십시오! DBase IV에서 테스트하지는 않았지만 FoxPro 및 DBase의 여러 가지 버전에서 작동합니다.

procedure FixDBFHeader(const FileName: string); 
var 
    ByteRead: Byte; 
    Stream: TFileStream; 
begin 
    Stream := TFileStream.Create(FileName, fmOpenReadWrite or fmShareDenyNone); 
    try 
    // Byte offset 28 has a value of 0x01 if a structural (auto-open) index exists, 
    // or 0x00 if no such index exists. If the value is not set, we do nothing. 
    Stream.Position := 28; 
    Stream.Read(ByteRead, SizeOf(ByteRead)); 
    if ByteRead = 1 then 
    begin 
     ByteRead := 0; 
     Stream.Position := 28; 
     Stream.Write(ByteRead, SizeOf(Byte)); 
    end; 
    finally 
    Stream.Free; 
    end; 
end; 

헤더에 그 깃발을 제거한 후, 당신은 ADO 또는 Advantage Database Server으로 .DBF을 열 수 있어야합니다 - 로컬 서버는 무료이며, SQL을 지원합니다. 나는 Advantage와 어떤 식 으로든 관련이 없다는 것을 알아 두십시오. 방금 전 제품을 사용하여 오랫동안 레거시 DBF 파일을 사용했습니다.

+0

+1 ** 데이터베이스의 복사본을 사용하여 테스트하십시오 !!! ** ** – Najem

관련 문제