Access97 MDB の変更をイベントで知るには?

解決


とんとん  2003-09-02 18:32:43  No: 4531

はじめまして。Access97 MDBを、TADODataSetで制御しています。
(Delphi6 Pro SP2: Win98)

マルチユーザ対応のデータベースソフトを作成しようと思っています。
作成した Exeと MDBを1台のPCに置き、LANで接続されている
他のPC (複数) が Exeへのショートカットで起動して使用する形を
とりたいと思っています。

マルチユーザで使用するため、他のPCがデータを追加/変更したことを
イベントで知りたいと思いました。
リストビューに表示するクエリー結果を、リアルタイムに正しく
表示したいのです。
定期的なポーリングをするのが定石なのでしょうか。
定期的なポーリングは、ネットワークに負担がかかりすぎるのではと
思い、質問した次第です。

どなたかご教授願えませんでしょうか。
よろしくお願いいたします。


にしの  2003-09-02 20:58:12  No: 4532

定期的にチェックするしかないと思います。
フォルダの状態を見ても、「更新」なのか、単に開いて閉じただけなのかなどわからないでしょうし。

マクロで外に知らせた方が確実では?


とんとん  2003-09-02 22:25:18  No: 4533

にしのさん、ありがとうございます。

>フォルダの状態を見ても、「更新」なのか、単に開いて閉じただけなのかなど
>わからないでしょうし。

これは拡張子 *.LDB のことでしょうか。
できれば、オープンしたクエリー結果のレコードの内容が
変更されたときにイベントが発生してくれないかと思った次第です。

>マクロで外に知らせた方が確実では?

もしよろしければ、具体的な例を教えて頂けませんでしょうか?
すみませんが、よろしくお願いいたします。


にしの  2003-09-02 22:42:55  No: 4534

Accessのマクロ=OracleのPL/SQLのように思っていました。Viewを更新したらTable更新と同時にイベント発生・・・のような。
できるかと思って調べてみましたができないみたいですね。
混乱させてすみません。

VBのRecordSetには、更新時のイベントがあるようですが、Accessで直接更新したときに起きるかどうかはわかりません。
共有MDBにして、ADODataSetで開いておけばイベントが来そうな気もします。
# LockTypeで、共有モード

> これは拡張子 *.LDB のことでしょうか。
> できれば、オープンしたクエリー結果のレコードの内容が
> 変更されたときにイベントが発生してくれないかと思った次第です。
いえ、「フォルダが更新されたか」です。
LDBが作成されても、フォルダの最終更新日付が更新されても、イベントが発生します。
このタイミングでDBの中身を確認するということです。
もしかしたら、フォルダの最終更新日付はフォルダ内のファイルの最終更新日付が変わっただけでは変化しないかもしれません。
# フォルダオプションか何かで変更できたような気がします


HOota  2003-09-04 19:52:12  No: 4535

TADODataSetを使うとOnRecordChangCompleteイベントが発生しますので、そこで処理すれば如何でしょうか?


とんとん  2003-09-06 09:24:33  No: 4536

HOotaさん、ありがとうございます。
現在、にしのさんに教えていただいた LockTypeのあたりを
勉強しています (共有モードってあるのでしょうか)。

>TADODataSetを使うとOnRecordChangCompleteイベントが発生しますので
>そこで処理すれば如何でしょうか?

他のPCがレコードを変更してもOnRecordChangeCompleteが
発生するのでしょうか。
もうちょっと勉強します。
(できましたら、具体例を挙げていただけると助かります)


XOOX  2003-10-04 04:06:11  No: 4537

遅レスですが
他の方の質問にも同系統のものがあるので書込みします。

基本的に共有に依存したデータベースネットワークプログラムは
速いうちにやめた方が良いと思います。

ではどうすればよいのかというと

クライアント:httpないしは独自のTCP/IPプログラム手抜をするならばブラウザー
サーバー:ローカルなデータベースプログラム(DBF,MDBなど)と
httpないしは独自のTCP/IPサーバーの組み合わせを使います。

でここで話を一段戻して
仮に現在の構成のままとして
データベースの各マシンへの変更通知方法について説明します。

この場合データベース本体のあるマシンに常駐型の
ファイル変更探知プログラム(自立でも何かとセットでもか)を起動しておきます。
ファイル変更はシェル関係のCOMで取得できます。
又通知はポーリングなどではなくてUDPプロトコルによるブロードキャストを使います。

クライアント側はUDPによる待ちうけプログラムを起動して待機していれば
いちいちポーリングしなくても変更時のみデータのあるから通知を受けることが出来ます。
変更頻度が多い事を想定する場合
受け側も独立したプログラムにしてログだけとっておくというのも手です。

この方法に類似した方法をとっているのは
UDPタイプのTIMEサーバー・クライアントです。
(ポーリング型とブロードキャスト型と両方ある。)

この書き込み内容はLAN内での放送やマルチ対戦ゲームなどにも適用できます。
ブロードキャスト型のUDPのサンプルは以前Torryで見かけたことがあります。

但しこの書き込みの情報を有効活用できる方ならば
この通知システムを実装すると同時に
最初に書いたようなサーバー・クライアント通信ベースのものを作れると思います。


とんとん  2003-10-04 11:45:37  No: 4538

XOOXさん、ありがとうございます。
ちょっと内容が難しくて、理解するのに時間がかかりそうですが・・・

>基本的に共有に依存したデータベースネットワークプログラムは
>速いうちにやめた方が良いと思います。

すみませんが、具体的な理由を教えていただけませんでしょうか。


XOOX  2003-10-05 20:59:44  No: 4539

無論PC五台以下で複数パソコンからは頻繁に同時にアクセスせず
かつOSはWinMeかWin2K以前ならば
無保証で使うという前提で使うのなら悪くはないと思います。

また「〜べき」というのには拘束力はありません。
一つのアドバイスと思ってください。

1.リンクによるプログラム起動は
起動側PCのデータベースエンジンからのファイルアクセスになるが
ホスト側は単なるファイルアクセスなので内容の同期が保障されない。
(変更とキャッシュのタイミングは制御しかねるものがあるため)

2.共有によるファイルアクセスは
システムレベルなので一つのクライアントのトラブルにより他のクライアントからアクセスできなくなる可能性が高い

3.インターネットに一台でも繋がっていると外部より改変される可能性がある。

4.逆に今後セキュリティ強化のため動かなくなる可能性がある。

5.ソフトパーツのクライアントとサーバーと両方へのインストールが必要なため
保守や選択肢が狭くなる

等が理由です。
MSAccessでもMDBファイルをネットワークドライブに置いて使うような用法はしないと思うのですがどうなんでしょう。

プログラムについての内容は概要さえつかめれば
自力で組まずとも寄せ集めで何とかなると思います。
とりあえず現在のプログラム本体とは別に
単体PCでのファイル変更検知とかログ取り
あるいはファイル自体のサイズやCRCやMD5値などによる変更認証を
一つ一つ組んでいけばそれらのルーチンやユニットは
他のプログラムを作るときにも無駄にはならないと思います。

最もデータベース部分を一系統にすると
ファイルの変更検知なんていらなくなるともいえます。
delphiは元々データベース処理がうりです。
よくわからないと思うのならば
素直にちゃんとしたデータベースのシステムを組んでください。
その方ができばえは確実です。


とんとん  2003-10-06 18:48:03  No: 4540

XOOXさん、詳細にご説明下さり、ありがとうございました。
アドバイスを参考に、勉強してみたいと思います。


とんとん  2003-10-06 23:29:13  No: 4541

既に解決としてしまったのですが・・・

>delphiは元々データベース処理がうりです。
>よくわからないと思うのならば
>素直にちゃんとしたデータベースのシステムを組んでください。

先程から、Delphi6の開発者ガイドを再度読み始めたのですが、
大海原に出てしまったような気分です。
もし "ここを読め" みたいなところがありましたら
ご教授願えませんでしょうか。

何卒、よろしくお願いいたします。


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

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






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