2

プログラムの複数のインスタンスで特定のテーブルを開くのに問題があります。ユーザーが現在のテーブル (データ ディクショナリの一部 - FileForm.ImagesTable) を開いて古いテーブル (データ ディクショナリに含まれていない) に置き換えられるようにしようとしています。プログラムの1つのインスタンスではうまく機能しますが、別のインスタンスで同じファイルを同時に開こうとすると. 次のエラーが表示されます。

FileName.ADT このファイルは使用中です。新しい名前を入力するか、別のプログラムで開いているファイルを閉じます。

以下は、テーブル名とデータパスを選択したテーブルに再割り当てしたコードです。

OpenDialog1.FileName := '*.adt';
OpenDialog1.Filter := 'Software 6.0 Files (*.adt)|*.adt|Software 5.x Files (*.dbf)|*.dbf';
OpenDialog1.InitialDir := DataPath;
if OpenDialog1.Execute then
begin
    Str1 := Trim(OpenDialog1.FileName);
    if Length(Str1) = 0 then
        Exit;
    DSImage.Enabled := False;

    with FileForm.ImagesTable do
    begin
        Active := False;
        AfterOpen := FileForm.TableOther.AfterOpen;
        DataBaseName := ExtractFilePath(Str1);   
        TableName :=  ExtractFileName(Str1);
        Active := True;
    end;
 end;

編集* Advtantage 8.1 を使用すると、ダイアログ ウィンドウでエラーが発生するため、Windows エラーのようです。はい、Exclusive は false に設定されています。

エラー


なぜこれが起こっているのか、そしてこれをどのように解決できるのかについてのご意見をお待ちしております。

ありがとう

4

2 に答える 2

4

特定のエラーについて明確ではありません - Windows エラーですか、それとも Advantage エラーですか?

Windows のエラーの場合は、テーブル ( ImageTable.Exclusive = True) への排他アクセスを指定したことが原因である可能性があります。これは、アプリの最初のインスタンスでアプリを開くことができても、それ以降の試行ではFile is in useエラーで失敗することを意味します。

アドバンテージ エラーの場合、アドバンテージ ヘルプ ファイル ( v11 のドキュメントでは、ADS のバージョンを指定しなかったため、フレーム内にあることに注意してください。このリンクを使用する必要がある場合があります。ナビゲートして、トピックAdvantage Developers Guideを展開してください) Part 1->Chapter 4 - Dictionaries->Understanding Dictionaries:

データ ディクショナリは、データベース テーブルへの唯一のアクセス ポイントとして機能する特別なファイルです。

唯一のアクセス ポイントに注意してください。テーブルがデータ ディクショナリに登録されると、そのテーブルはデータ ディクショナリに属します。その参照を辞書の範囲外のものに置き換えようとしていますが、それは許可されていません。問題はそれに関連していると確信しています.ADSは、ディクショナリに含まれるテーブルに独自のロックを設定し、ディクショナリを介してサーバーを介してそれらのファイルへのアクセスを制御します。

ディクショナリからテーブルを削除して空きテーブルとして使用するか、現在のデータを削除して他のデータに置き換えてディクショナリの整合性を維持するための別の方法を考え出す必要があります。

于 2012-09-22T00:46:15.107 に答える
3

テーブルの名前を取得するために[開く]ダイアログのみを使用しているようです。
[開く]ダイアログで、ShareAwareのオプションを設定してみてください

OpenDialog1.Options:= OpenDialog1.Options + [ofShareAware];

テーブルがAdvantageで開かれると、モードは書き込み拒否と読み取り拒否の両方になり、その結果、Advantage以外のものがテーブルを開こうとすると、共有エラーが返されます。

于 2012-09-25T18:47:06.873 に答える