Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8589 / 13646 ツリー ←次へ | 前へ→

【32432】ADO接続での同時アクセス台数 momo 05/12/14(水) 18:01 質問[未読]
【32435】Re:ADO接続での同時アクセス台数 井上治 05/12/14(水) 20:20 発言[未読]
【32440】Re:ADO接続での同時アクセス台数 momo 05/12/15(木) 8:59 お礼[未読]
【32441】Re:ADO接続での同時アクセス台数 inoue 05/12/15(木) 9:55 発言[未読]

【32432】ADO接続での同時アクセス台数
質問  momo  - 05/12/14(水) 18:01 -

引用なし
パスワード
   こんにちは。
超初心者から初めて、なんとか、社内のLAN内にデータベースを置くようなVBAアプリを作るところまで漕ぎ着けました。
これもひとえに、この掲示板のおかげなのですが。。。m(_ _)m

ところで、
共有フォルダ内のアクセスのデータベース(mdb)に、
EXCELマクロから、ADOとSQLを使って(?)、
読み書きするというモノを作成しました。
一度に、最大で15人ほどの人数がアクセスすることになるのですが、
これに制限はあるのでしょうか?
作り上げてしまってから、こんな不安を残していることに気がついたのですが、
どなたか、お教えくださいm(_ _)m

【32435】Re:ADO接続での同時アクセス台数
発言  井上治 E-MAILWEB  - 05/12/14(水) 20:20 -

引用なし
パスワード
   こんにちは。

>最大で15人ほどの人数がアクセス
であれば、MDBに対する読み出しや書き込みのアクセスが
同時に複数発生することはほとんどないはずです。
後は「作り」の問題ですが、ADOの場合、アクセスが必要になる都度
ADODB.Connectionを接続し、読み出しや書き込みが終わった時点で
接続をCloseさせてしまうように配慮すれば
ほとんど問題はないはずです。

例えば、下記URLはASPでADOを扱っていますが、
Webシステムはレコードをロックすることが事実上できないので
読み出しや書き込みのタイミング以外はConnectionを解放してしまいます。
[データベースからの内容表示]
http://www.asahi-net.or.jp/~ef2o-inue/asp/sub12_02_02.html

ただし、この方法ではレコードのロックは行なわないので、
同一レコードを取り合うような運用がある場合には向かないかも知れません。
特にレコードの削除については物理的なDeleteは行なわずに、
登録区分のようなフィールドを用意して論理上で削除を示すような配慮が
必要です。

【32440】Re:ADO接続での同時アクセス台数
お礼  momo  - 05/12/15(木) 8:59 -

引用なし
パスワード
   おはようございます!
さっそく教えてくださったのに、お返事が遅れて申し訳ありません。
一応、

接続 MDB_FILENAME'=異なるmdbを扱うこともあるため、ファイル名がいれてあります
myRst.Open myTblsql, myDb, adOpenKeyset, adLockBatchOptimistic
'
.Sheets("Sheet1").Range("A1").CopyFromRecordset myRst
'
myRst.Close: Set myRst = Nothing
myDb.Close: Set myDb = Nothing


Function 接続(myFileName)
myDb.Provider = "Microsoft.Jet.OLEDB.4.0"
myDb.ConnectionString = ThisWorkbook.Path & "\" & myFileName
myDb.Open
End Function

のような形で、せいぜい1行か2行の処理(CopyFromRecordsetか.RecordCountの取得程度)しかせずに、Closeすることにしています。

>特にレコードの削除については物理的なDeleteは行なわずに、
>登録区分のようなフィールドを用意して論理上で削除を示すような配慮が
>必要です。

このことには、気づきませんでした!
メンテナンス用にと思い、物理削除後、別のテーブルに保存することにしていたのですが。
これなら、ほぼ問題は回避できそうですね!
利用状況としては、同一レコードをupdateする確立はかなり低く(担当者ごとに処理範囲が異なることが通常なので)、
また1人につき、2,3分に一度、1作業(select数回+updateまたはinsert1回程度)をするものなので、おそらくは大丈夫でしょうか。

なんとか安心して本導入に持ち込めそうです!
本当にありがとうございました。

【32441】Re:ADO接続での同時アクセス台数
発言  inoue E-MAILWEB  - 05/12/15(木) 9:55 -

引用なし
パスワード
   >利用状況としては、同一レコードをupdateする確立はかなり低く
>(担当者ごとに処理範囲が異なることが通常なので)、
まあ、「低いから対策なしで良い」ということはないので、
できれば更新モードでレコードセットを取る時は排他で処理されるように
考えた方が安全です。
私のところでは更新内容を全てSQLベースに編集してログファイルに書き出して
いるので、このログファイルを通常のテキストベースで
Lock WriteでOpenさせています。
ここからログファイルをCloseさせるまでの間にテーブルもUpdateさせるので
仮に同一レコードをUpdateさせても交錯しません。
但し、ログファイルのOpenで失敗が起きるので、
エラー処理でランダム値を使って100〜500ミリ秒をWaitさせて再試行しています。
Webシステムのようにレコードロックを行なわない場合は
運用アクションに合わせた時系列処理が重要です。
更新レコードが複数になる場合に、1つの更新セット中に他の更新が混ざるのを
防ぐ方法です。

>また1人につき、2,3分に一度、1作業
>(select数回+updateまたはinsert1回程度)をするものなので、
>おそらくは大丈夫でしょうか。
実際の更新動作は一瞬なので問題はないと思います。
上のような対応まで行なえば更新で「取り合い」は起こりません。
(同時更新が起きると後側が一瞬待たされることになります。)
さらにADOで進めておけば、いざ「MDBでは無理」となった時、
本格的なネットワークDBへの移行も用意です。

8589 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free