ACCESS 排他制御について考える・その2 [ACCESS]
この記事も試行錯誤して失敗した、その経緯を記述した物なので、参考になりません。
切にACCESSでの排他の方法をお探しの方は、他を当たってください。
さて、いろいろ排他について調べていて、もう一つ排他に使えそうな物を見つけました。
ACCESSの接続文字列の中に、
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=・・・;Mode=Share Deny Read|Share Deny Write;・・・
という部分があります。
このShare Denyは、排他に関する記述というのは知っていたので、改めて内容を調べてみました。
MSDNで検索をかけたら、ちょっと違うけど、それっぽい記述を見つけました。
READ
データベースの読み取り専用のコピーを開くことができます。
WRITE
データベースの書き込み専用のコピーを開くことができます。
READWRITE
複数のプロセスで、データベースを開いたり、変更できます。
SHARE DENY READ
他のプロセスは読み取りモードで開けません。
SHARE DENY WRITE
他のプロセスは書き込みモードで開けません。
SHARE EXCLUSIVE( SHARE DENY READ | SHARE DENY WRITE )
他のプロセスは読み取り/書き込みモードで開けません。
SHARE DENY NONE
他のプロセスからの読み取りまたは書き込みを拒否できません。
これを踏まえて、ちょっと実験です。
Dim CnA As New ADODB.Connection
Dim CnB As New ADODB.Connection
CnA.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;DATA SOURCE=D:\TEST.accdb;Mode=Share Deny Write;"
CnB.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;DATA SOURCE=D:\TEST.accdb;Mode=ReadWrite;"
を実行してみます。
CnBのOpenで、下図のエラーが起きました。
分かり易いパターンですが、他からのアクセスを拒否する事ができました。
しかし、実際のプログラムは、このパターンでは作れません。
「自分は読み書きして、他からは書き込みできない」というモードが欲しいのですが、どう書いて良いのかわかりません。
「Readwrite | Share Deny Write」かなぁと思いつつ、これはエラーになってしまいます。
そこで、「Mode=Share Deny Write」の右辺は、英語の綴りになっていますが、実際のパラメタは数値であって、対応する数字で設定しても大丈夫なんじゃないかと予測しました。
で、「Mode=1」「Mode=2」と数字を順に設定してOpenしてみました。Openしたあと、Connectionを参照して、どんな接続文字列になっているかを確認してみました。
結果は以下の通り。
1・Mode=Read
2・Mode=Share Deny None
3・Mode=ReadWrite
4・Mode=Share Deny None
5・Mode=Share Deny None
6・Mode=Share Deny None
7・Mode=Share Deny None
8・Mode=Share Deny Write
9・Mode=Share Deny None
10・Mode=Share Deny None
11・Mode=Share Deny None
12・Mode=Share Deny Read|Share Deny Write
13・Mode=Read|Share Deny Read|Share Deny Write
14・Mode=Share Deny None
15・Mode=Share Deny None
16・Mode=Share Deny None
17・Mode=Share Deny None
18・Mode=Share Deny None
19・Mode=ReadWrite|Share Deny None
これ以外の値は、エラーになりました。
2進数で見てみたりしましたが、法則性はわかりませんでした。
「Readwrite | Share Deny Write」という設定は、存在しないようです。
結論。
自分だけ読み書きできて、他の人は書き込めない(読み込みのみ)という状態は作れない。
と言うことみたいです。この方法では。
あ、これはデータベースがACCESSの場合です。OracleやSQLServerは他の方法があります。
コメント 0