DOBON.NET DOBON.NETプログラミング掲示板過去ログ

MDBのロック

環境/言語:[XP VS2008 C# Framework3.5]
分類:[.NET]

お世話になります。
VS2008(C#) ACCESS2000を使っています。
(ちなみに以前はVS2003で作っていましたが、同じ現象が起きているようです)

アプリ起動時にmdbにアクセスして情報を取得しているのですが
以下のパターンの場合、MDBがロックされていて読めないみたいなのです。
(共有はしていません)
自分の環境ではおきないのですが。。。。

アプリはOS起動時に自動起動しています。

1.リモート接続でログインしたとき(リモート先)

2.実機でアプリが起動している状態でスリープで落とし、
  別の場所に行ってスリープを解除(このときネットワークが変わっています)
  したとき

エラーが出た後、アプリを再起動すれば問題ないようですが。。。。

通常に使っている分では問題ないようです。
アプリでは監視プログラムで、MDBにアクセスするのは読み込みだけです。


VSとは関係ないのかもしれませんが、何かしらロックされる原因をご存知の
方いらっしゃいますか?
システムがロックしているのでしょうか・・・・・
  • 題名: Re[1]: MDBのロック
  • 著者: キャンディ
  • 日時: 2010/01/29 12:47:02
  • ID: 26345
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
補足です。

ロックされているのはDBOpenするところです。
テーブルロックではなく、DBそのものがロックされるようです。

OS起動時やスリープからの復帰、リモート接続してリモート先にログインするとき
等のようです・・・・・・・

が、似たようなパターンで検証しても、私のマシンや他のマシンでは出ません
(T_T)

OSが稼動されるとき不安定な状態で、MDB自身にロックがかかるあるいは
アクセスしに行こうとしたときにアクセスできないという現象があるのでしょうか。
あるのでしたらそれは回避できるのでしょうか。。。。。
  • 題名: Re[1]: MDBのロック
  • 著者: オショウ
  • 日時: 2010/01/29 14:50:41
  • ID: 26346
  • この記事の返信元:
  • この記事への返信:
  • ツリーを表示
■No26344に返信(キャンディさんの記事)
> 自分の環境ではおきないのですが。。。。

  とは?
  あなたのPCにリモートログインして実行しても発生しない。
  ということですか?

> 1.リモート接続でログインしたとき(リモート先)

  このリモート接続とは、リモートデスクトップ接続ですか?

> 2.実機でアプリが起動している状態でスリープで落とし、
>   別の場所に行ってスリープを解除(このときネットワークが変わっています)
>   したとき

  このネットワークが変わるとは?
  IPアドレスが変わると云うことですか?

> エラーが出た後、アプリを再起動すれば問題ないようですが。。。。

  OleDbで接続されていると思うのですが、接続文字列はどのように
  書いてますか?

  ネットワークに依存するような書き方だと、上記のネットワークが
  変わる・・・に影響を受けているような・・・

以上。
すみません。状況を補足します。ばたばたして確認できてませんでした

>あなたのPCにリモートログインして実行しても発生しない。
>   ということですか?

リモートログインしても発生しません。
実機でアプリ稼働中にスリープして、自宅に帰り、開いてもアプリは
正常に動いています。

>>1.リモート接続でログインしたとき(リモート先)
>
>   このリモート接続とは、リモートデスクトップ接続ですか?

はい。そうです。もしくはシンクライアントの場合らしいです(←ユーザー)

>>2.実機でアプリが起動している状態でスリープで落とし、
>>  別の場所に行ってスリープを解除(このときネットワークが変わっています)
>>  したとき
>
>   このネットワークが変わるとは?
>   IPアドレスが変わると云うことですか?

そうです。別のネットワークに接続し、スリープを解除したときです。
(スリープしたときとネットワークが違うときです。例えば会社でスリープして
出先で別のネットワークに接続した状態でスリープ解除)

>>エラーが出た後、アプリを再起動すれば問題ないようですが。。。。
>
>   OleDbで接続されていると思うのですが、接続文字列はどのように
>   書いてますか?

OleDbConnection OleConn = new OleDbConnection();
OleDbDataAdapter OleDA;
OleDbDataReader objDataReader;
OleDbCommand objSqlCommand;
OleDbConnection Cn = new OleDbConnection();

Cn.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source={MDBのパス}" +
";Persist Security Info=False;" + "Jet OLEDB:Database Password=パスワード";


>   ネットワークに依存するような書き方だと、上記のネットワークが
>   変わる・・・に影響を受けているような・・・

ネットワークが変わったらどうだとか・・・・・というような絡みはないのですが。
また現象についても全部のマシンが出るわけでなく、
30台中5台のマシンが出るときと出ないときがあるということなのです。
(同じ状態で毎回出るわけではない)

エラーが出たときはアプリケーションのApplication.Restart();をかけてやるよう
にしたら通常に動くようなのです。
(とりあえずエラーを通知するメッセージボックスを出してOKを押したとき)

また、二つの会社(兄弟会社)で同じプログラムを使っているのですが、
Aという会社では起こり、Bという会社では特に起こったことはないということで
PC本体に問題があるのでしょうか・・・・・
■No26347に返信(キャンディさんの記事)
> そうです。別のネットワークに接続し、スリープを解除したときです。
> (スリープしたときとネットワークが違うときです。例えば会社でスリープして
> 出先で別のネットワークに接続した状態でスリープ解除)

  そんな使い方すること自体が、マイクロソフトにすれば想定外かも

  検索したら、こんな情報ありました。
  関連あるかどうか・・・

  http://wave-u.hp.infoseek.co.jp/iis40/80004005.htm

> また現象についても全部のマシンが出るわけでなく、
> 30台中5台のマシンが出るときと出ないときがあるということなのです。
> (同じ状態で毎回出るわけではない)

  OSは何ですか?
  WinXP と、Win2000 とか?・・・

> エラーが出たときはアプリケーションのApplication.Restart();をかけてやるよう
> にしたら通常に動くようなのです。
> (とりあえずエラーを通知するメッセージボックスを出してOKを押したとき)

  エラーコードを取得しましょう!

> また、二つの会社(兄弟会社)で同じプログラムを使っているのですが、
> Aという会社では起こり、Bという会社では特に起こったことはないということで
> PC本体に問題があるのでしょうか・・・・・

  ローカルエリアネットワークのIPアドレスのクラスに関係している
  可能性もゼロではない・・・

  たとえば、
  192.168.0.x/255.255.255.0
  や、
  172.30.22.x/255.255.0.0
  だったりする・・・要は、CクラスかBクラスか・・・なんてことも。

以上。
  • 題名: Re[4]: MDBのロック
  • 著者: キャンディ
  • 日時: 2010/01/30 16:16:02
  • ID: 26355
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
ありがとうございます。
検索までしていただいて恐縮です。

■No26352に返信(オショウさんの記事)
> ■No26347に返信(キャンディさんの記事)
>>そうです。別のネットワークに接続し、スリープを解除したときです。
>>(スリープしたときとネットワークが違うときです。例えば会社でスリープして
>>出先で別のネットワークに接続した状態でスリープ解除)
>
>   そんな使い方すること自体が、マイクロソフトにすれば想定外かも
>
>   検索したら、こんな情報ありました。
>   関連あるかどうか・・・
>
>   http://wave-u.hp.infoseek.co.jp/iis40/80004005.htm

これが怪しいですね・・・・

>
>>また現象についても全部のマシンが出るわけでなく、
>>30台中5台のマシンが出るときと出ないときがあるということなのです。
>>(同じ状態で毎回出るわけではない)
>
>   OSは何ですか?
>   WinXP と、Win2000 とか?・・・

XPのようです

>
>>エラーが出たときはアプリケーションのApplication.Restart();をかけてやるよう
>>にしたら通常に動くようなのです。
>>(とりあえずエラーを通知するメッセージボックスを出してOKを押したとき)
>
>   エラーコードを取得しましょう!
>
>>また、二つの会社(兄弟会社)で同じプログラムを使っているのですが、
>>Aという会社では起こり、Bという会社では特に起こったことはないということで
>>PC本体に問題があるのでしょうか・・・・・
>
>   ローカルエリアネットワークのIPアドレスのクラスに関係している
>   可能性もゼロではない・・・
>
>   たとえば、
>   192.168.0.x/255.255.255.0
>   や、
>   172.30.22.x/255.255.0.0
>   だったりする・・・要は、CクラスかBクラスか・・・なんてことも。
>
> 以上。

そうですね。IPアドレスは上記のような感じです。
実際に利用しているお客様で確認したいところですが、サンプルプログラムを置いてもらったりはできないのです(T_T)
最初エラー回避していないときに出ていたメッセージは

アプリケーションを起動できません。システムデータベースが存在しないか
または他のユーザが排他的にデータベースを開いています

となっているようです。
ネットワークのクラスが変わるためにODBCが使えない状態になっているかもしれませんね。
たまたまそのときDB検索をしようとしたときに出るのかも知れません。
回避策といっても・・・・アプリケーションではRestartをかける以外に方法はない・・・でしょうか・・・・。
一応、OpenするときにOPENできなかったら何回かretoryするようなロジックには
しているのですが・・・・
(Openに失敗したら2秒sleepしてもう一度。それを20回繰り返してダメだったらとしているのですが・・・
  • 題名: Re[4]: MDBのロック
  • 著者: キャンディ
  • 日時: 2010/02/02 10:33:59
  • ID: 26362
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
オショウさんお世話になります

結局のところ、常駐時にもアクセスしに行くところがありましたので、
OPENできない状態にぶつからないよう、DBアクセスをやめる対処で
回避することになりそうです。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板