Access mdbの共有について

解決


ラーク  2008-03-04 02:20:00  No: 30014

いつもお世話になっています。

DelphiでAccessを使用するアプリケーションを開発しているのですが、次のような要件があり、最適な方法が無いか探しています。

【要件】
・MDBファイルをネットワーク上共有フォルダに置いておき、複数台のクライアントからの同時接続が発生する。
・起動時に、MDBが他クライアントによって開かれているか状況確認し、既に開かれていたら自分は読み込み専用モードでアプリケーションを起動する。
・MDBのファイル共有状況を確認し、開かれていなかったら、書き込みを許可するモードでアプリケーションを起動する

この中で、「MDBが他クライアントによって開かれているか状況確認」が、ADO若しくはDAOでできないかと模索してます。

すいませんが宜しくご教授下さい。


Ru  2008-03-04 19:25:07  No: 30015

対象のMDBファイル開いたら,必ずldbファイル(Access.LockFile?)できるものでしたっけ?
ADO,DAOではありませんが,ldbファイルが必ず出来るなら,
FileExistsで対処できませんかね?

  if FileExists('\\abcd\****.ldb') = True then
  begin
    ShowMessage('ファイルが存在します');
  end;


ラーク  2008-03-05 00:45:01  No: 30016

Ru様
ありがとうございます。

ldbファイルで判断することもできるのですが、アプリケーションが不正終了した場合はldbファイルが正しく削除されないことがあり、これだけで判断するのはフェイルセーフ的に厳しいかなと考え、別の方法を探してるような状況です。。


むく  2008-03-05 01:00:27  No: 30017

ADO、DAOでってことなのでちょっと違いますが、自分だったらLOCKテーブルを作ってLockテーブルにシステム起動時OnOffを入れるようにします。
アプリケーション異常時もLockUser管理をして同じ人ならロック済として判断したり。


Ru  2008-03-05 02:40:39  No: 30018

>アプリケーションが不正終了した場合はldbファイルが正しく削除されないことがあり

この部分に対応できてるか怪しいですが下記のHP参考にしてはどうでしょう?
http://www.delphi3000.com/printarticle.asp?ArticleID=3988

確認の際にDBに接続しますので最低でもユーザー名は一つ返ってくる(自分自身)と思います。2つ以上だと誰か繋いでいるという状態になるんですかね・・・?

procedure ReadLoggedUsers(AConnection:TADOConnection; ExtractUsers:boolean;
      List:TStrings);

const JET_SCHEMA_USERROSTER = '{947bb102-5d43-11d1-bdbf-00c04fb92675}';

procedure TForm1.ReadLoggedUsers(AConnection:TADOConnection; ExtractUsers:boolean;
  List:TStrings);
var
  Dataset : TADODataset;
  s : string;
begin
  if (AConnection<>nil) and (List<>nil) then begin
    List.Clear;
    Dataset := TADODataset.Create(nil);
    try
      Dataset.Connection := AConnection;
      AConnection.OpenSchema(siProviderSpecific, EmptyParam,
        JET_SCHEMA_USERROSTER, Dataset);
      while not Dataset.EoF do begin
        if ExtractUsers
          then s := Dataset.FieldByName('LOGIN_NAME').AsString
          else s := Dataset.FieldByName('COMPUTER_NAME').AsString;
        List.Add(s);
        Dataset.Next;
      end;
    finally
      Dataset.Free;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  aaa: TStrings;

begin

  aaa := TStringList.Create;
  try
    ReadLoggedUsers(ADOConnection1, False, aaa);
    ShowMessage(aaa.Text);
  finally
    aaa.Free;
  end;

end;


ラーク  2008-03-05 19:40:55  No: 30019

書き込みありがとうございます。
Ruさんの方法を試してみたいと思います。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加