2

ADOConnectionとAdoTableを使用して、古いdBaseデータベースからいくつかの情報をコピーする必要があります。すべてのテーブルを開くことができますが、この例外が発生します

データプロバイダーまたは他のサービスがE_FAILステータスを返しました

大きなテーブルを開こうとしているときに1.01GB(1 093 588 624バイト)。パフォーマンスが非常に悪いことに注意してください。これは接続文字列です

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

3 に答える 3

5

CursorLocationTADOConnectionのデフォルト設定はですclUseClient。この設定では、データセット全体がクライアントによってメモリに読み込まれます。それは遅さを説明し、エラーを説明するかもしれません。

に変更してみてくださいclUseServer

ADOConn.CursorLocation := clUseServer;

または、オブジェクトインスペクターのプロパティで変更できます。

于 2011-03-24T14:41:03.673 に答える
4

これは、ヘッダーに autoopen (.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 データベース サーバーで .DBF を開くことができるようになります。ローカル サーバーは無料で、SQL をサポートしています。私はアドバンテージとは何の関係もありません。私は彼らの製品を使用して、レガシー DBF ファイルを長い間操作してきました。

于 2011-03-24T15:02:24.080 に答える
-1

それでも TAdoConnection に問題がある場合は、Apolloをお勧めします。これは、さまざまなテーブル タイプ (Clipper NTX、Foxpro CDX) をサポートしています。

于 2011-03-24T14:56:48.780 に答える