C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: VBからAccess.mdb接続 排他モード時処理


(過去ログ 70 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■40793 / inTopicNo.1)  VBからAccess.mdb接続 排他モード時処理
  
□投稿者/ hs (124回)-(2009/09/03(Thu) 11:28:14)

分類:[VB.NET/VB2005 以降] 

VS2008 VB

いつもお世話になっております。
VBでAccessのmdbをDBとしアプリを開発しております。
いろいろと検索してみたのですが、mdbは同時に複数のユーザーが更新を行った場合、簡単に壊れるとのことでした。
そこで、別ユーザーが排他モードでmdbをOpenしている事を判別できればと考えております。

やりたいことは、Buttonクリック時などに
Cn.Open
Try
  Do
    ほかのユーザーが排他モードでOpenしているか判別
    
    If 排他でなければ
      更新処理実行
      Exit Do 'ループを抜ける
    Else
      '一定時間待機
      System.Threading.Thread.Sleep(500)
End If
  Loop
Catch ex
  MsgBox(ex.Message)
Finaly
  Cn.Close()
  MsgBox("完了")
End Try

現状、複数ユーザーが更新処理を同時に行った際に取得できているエラーは 「他のユーザーまたはプロセスで使用されているの、ロックできませんでした。」というエラーです。

よろしくお願いします。


引用返信 編集キー/
■40795 / inTopicNo.2)  Re[1]: VBからAccess.mdb接続 排他モード時処理
□投稿者/ 魔界の仮面弁士 (1264回)-(2009/09/03(Thu) 12:07:53)
No40793 (hs さん) に返信
> VBでAccessのmdbをDBとしアプリを開発しております。

mdb は、64bit アプリから利用できないという制限もありますので、
他の製品(SQL Server Compact / SQL Server Express 等)を使った方が無難かも。

# もっとも、今から方向修正するわけには行かないのでしょうけれども。


> そこで、別ユーザーが排他モードでmdbをOpenしている事を判別できればと考えております。

単純に mdb に接続してみて、エラートラップで判断してください。

排他接続されている場合、他の接続は全て例外となりますので、
それを Catch してやれば OK です。


>     ほかのユーザーが排他モードでOpenしているか判別
>     If 排他でなければ
事前判定するのはマズイかと。

判定してから、実際に利用するまでの僅かなタイミングで、
他の排他接続が割り込まれる可能性がありえますので、例外処理等を用いて、
判定と処理を同時に行った方が安全かと思いますよ。


>       '一定時間待機
>       System.Threading.Thread.Sleep(500)
フォームを持つメインスレッドからは、Sleep を呼び出さないようにしてください。


> 現状、複数ユーザーが更新処理を同時に行った際に取得できているエラーは 「他のユーザーまたはプロセスで使用されているの、ロックできませんでした。」というエラーです。
微妙にメッセージが間違っている気も。

引用返信 編集キー/
■40798 / inTopicNo.3)  Re[2]: VBからAccess.mdb接続 排他モード時処理
□投稿者/ hs (125回)-(2009/09/03(Thu) 12:56:33)
No40795 (魔界の仮面弁士 さん) に返信

いつもありがとうございます。

> mdb は、64bit アプリから利用できないという制限もありますので、
> 他の製品(SQL Server Compact / SQL Server Express 等)を使った方が無難かも。

このことは全く知りませんでした。大変重要な情報ありがとうございます。

> 単純に mdb に接続してみて、エラートラップで判断してください。
> 排他接続されている場合、他の接続は全て例外となりますので、
> それを Catch してやれば OK です。

なるほど!まったく思いつきませんでした。

> '一定時間待機
> System.Threading.Thread.Sleep(500)
> フォームを持つメインスレッドからは、Sleep を呼び出さないようにしてください。

別スレッドで行うようにします。


>> 現状、複数ユーザーが更新処理を同時に行った際に取得できているエラーは 「他のユーザーまたはプロセスで使用されているの、ロックできませんでした。」という>> エラーです。
> 微妙にメッセージが間違っている気も。

すいません。このエラーメッセージは、SELECTとINSERTの同時接続でした。

ところで、mdbは64bitアプリでは利用できなとの事ですが、恥ずかしながら、何bitという規格?というものを今まで全く意識したことがありませんでした。
というか知りませんでした。
現在、32bitのPCで動いているということは、おそらく作成しているアプリは32bitということではあると思うのですが、
作成しているアプリのBitを確認するにはどうすればよいのか教えていただけると幸いです。

よろしくお願いします。
引用返信 編集キー/
■40800 / inTopicNo.4)  Re[3]: VBからAccess.mdb接続 排他モード時処理
□投稿者/ 魔界の仮面弁士 (1265回)-(2009/09/03(Thu) 14:08:09)
No40798 (hs さん) に返信
>> mdb は、64bit アプリから利用できないという制限もありますので、
> このことは全く知りませんでした。大変重要な情報ありがとうございます。
MDB の場合、JET 接続用のドライバ(ODBC, DAO, OLEDB Provider等)が
現在のところ 16bit 版と 32 bit版しか存在していないため、
64 bitアプリからは呼び出す事ができないのです。

>>'一定時間待機
>>System.Threading.Thread.Sleep(500)
>>フォームを持つメインスレッドからは、Sleep を呼び出さないようにしてください。
> 別スレッドで行うようにします。

あるいは Timer を使い、0.5秒間隔ごとの Tick イベントで再接続を試みるという手も。


> ところで、mdbは64bitアプリでは利用できなとの事ですが、恥ずかしながら、何bitという規格?というものを今まで全く意識したことがありませんでした。
64bit 版の Windows 上では、32bit アプリと 64bit アプリが動作します。16bit アプリは動作しません。
32bit 版の Windows 上では、32bit アプリと 16bit アプリが動作します。64bit アプリは動作しません。

Windows のパッケージやバージョン情報に、「X64 Edition」「for Itanium-based Systems」「IA64」などの
表記があれば、それらは 64bit 版の Windows という事になります。

それ以外のものについては、基本的には 32 bit 版と思って良いでしょう(x86 版と書かれている場合もあります)。

今後登場する事になる Windows(特に Windows Server 製品)では、
32bit 版は登場せず、64bit 版のみになるとされています。
まだまだ 32bit 環境の方が優勢ですが、移行の準備は進めておいた方が良いでしょう。
(なお Windows 7 は、32bit 版も 64 bit版もリリースされます)


> 作成しているアプリのBitを確認するにはどうすればよいのか教えていただけると幸いです。
VS2008 の開発環境で、画面上部の [Debug]/[Release] というボックスの隣に、
[Any CPU] というボックスがあるかと思います。

これは、動作プラットフォームを指定する物で、[Any CPU] とは、
64bit Windows では 64bit アプリとして動作し、
32bit Windows では 32bit アプリとして動作するというものです。

ここを [X64] または [Itanium] にすると、64bit 専用アプリとなります。
(32bit OS 上では動作しません。64 bit 環境でのみ動作します。)

[x86] に設定した場合には、32bit で動作するアプリとなります。
(64bit 環境では、32bit をエミュレートした "WOW64" というモードでの動作となります。)

http://msdn.microsoft.com/ja-jp/events/dd282855.aspx

引用返信 編集キー/
■40804 / inTopicNo.5)  Re[4]: VBからAccess.mdb接続 排他モード時処理
□投稿者/ hs (126回)-(2009/09/03(Thu) 15:58:26)
No40800 (魔界の仮面弁士 さん) に返信

> あるいは Timer を使い、0.5秒間隔ごとの Tick イベントで再接続を試みるという手も。

簡単ですがこんな感じに組んでみました。
Private Sub BackgroundWorker1_DoWork(..省略..) Handles BackgroundWorker1.DoWork
  On Error GoTo err

  Cn.Open()
  更新処理実行
  Cn.Close()

  MsgBox("完了") 
  Exit Sub

err:
  System.Threading.Thread.Sleep(500): Resume
End Sub

動作確認したところ問題はないように実行されております。
もし不備があればアドバイスお願いします。


> 64bit 版の Windows 上では、32bit アプリと 64bit アプリが動作します。16bit アプリは動作しません。
>  ・
>  ・
>  ・
> http://msdn.microsoft.com/ja-jp/events/dd282855.aspx

大変勉強になりました。ありがとうございます。
引用返信 編集キー/
■40829 / inTopicNo.6)  Re[5]: VBからAccess.mdb接続 排他モード時処理
□投稿者/ hs (127回)-(2009/09/04(Fri) 10:21:46)
また何かあった時はよろしくお願いします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -