いつもお世話になっています。
DelphiでAccessを使用するアプリケーションを開発しているのですが、次のような要件があり、最適な方法が無いか探しています。
【要件】
・MDBファイルをネットワーク上共有フォルダに置いておき、複数台のクライアントからの同時接続が発生する。
・起動時に、MDBが他クライアントによって開かれているか状況確認し、既に開かれていたら自分は読み込み専用モードでアプリケーションを起動する。
・MDBのファイル共有状況を確認し、開かれていなかったら、書き込みを許可するモードでアプリケーションを起動する
この中で、「MDBが他クライアントによって開かれているか状況確認」が、ADO若しくはDAOでできないかと模索してます。
すいませんが宜しくご教授下さい。
対象のMDBファイル開いたら,必ずldbファイル(Access.LockFile?)できるものでしたっけ?
ADO,DAOではありませんが,ldbファイルが必ず出来るなら,
FileExistsで対処できませんかね?
if FileExists('\\abcd\****.ldb') = True then
begin
ShowMessage('ファイルが存在します');
end;
Ru様
ありがとうございます。
ldbファイルで判断することもできるのですが、アプリケーションが不正終了した場合はldbファイルが正しく削除されないことがあり、これだけで判断するのはフェイルセーフ的に厳しいかなと考え、別の方法を探してるような状況です。。
ADO、DAOでってことなのでちょっと違いますが、自分だったらLOCKテーブルを作ってLockテーブルにシステム起動時OnOffを入れるようにします。
アプリケーション異常時もLockUser管理をして同じ人ならロック済として判断したり。
>アプリケーションが不正終了した場合は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;
書き込みありがとうございます。
Ruさんの方法を試してみたいと思います。
ありがとうございました。
ツイート | ![]() |