- ベストアンサー
アクセスファイルの開閉制御について
- 「accessがもし開いてるなら開かない」とするにはどうすればいいでしょうか?
- アクセスのファイルを開くことができる方法はありますが、既に開かれている場合は開かないようにする方法はありますか?
- アクセスファイルを開く際に、すでに開かれている場合には開かないようにする方法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>Open "ファイルのパス" For >と、Closeに、下線が引かれてしまいます。 あぁ、VB.Netだったんですね。そう言えば CreateObjectにSet文がありませんね。 VB.Net系では以下のようになります。 Dim メッセージ As String Try FileOpen(1, "C:\Users\Documents\test.mdb", _ OpenMode.Input, , OpenShare.LockReadWrite) FileClose(1) Catch 例外 As System.Exception メッセージ = 例外.Message End Try If メッセージ = "" Then '誰も開いていない Else '誰かが開いている End If FileOpen、FileCloseは他に以下の方法もあります。 Imports System.IO Dim S As FileStream = File.Open"C:\Users\Documents\test.mdb", _ FileMode.Open,FileAccess.Read,FileShare.None) S.Close() VBはVB6.0とVBA、VB.NET以降では全く異質の 言語です。質問の際には使用するVBバージョンを 明記した方がよろしいでしょう。
その他の回答 (5)
- mitarashi
- ベストアンサー率59% (574/965)
#1です。回答ではありません。この場をお借りして申し訳ありません。 nda23様 ご回答ありがとうございました。ロックファイルが異常終了で残っていると悪さをする印象を持っていたのですが、ロックファイルが残っていて起動できないという場合は、mdbが壊れかかっているといった異常事態なのですね。認識を改めました。
- nda23
- ベストアンサー率54% (777/1415)
#1様へ Openステートメントは単にファイルを開く だけです。ファイルがMDBかどうかは 関係ありません。 また、データベースを開く訳でもないので、 Openに成功したからと言って、内部の テーブルを利用できることもありませんし、 ファイルを閉じてもロックファイルが消える こともありません。よって、aでもbでもあり ません。排他的にファイルをOpenできたら、 直ぐにClose→OpenCurrentDatabaseを 行うことで目的が達成できるでしょう。 CloseとOpenCurrentDatabaseの間に 他のプロセスから開かれてしまう可能性は 否定できませんが、確率は非常に低いと 言えます。 また、前回のロックファイルが消えずに残って いてもOpenDatabase等、AccessとしてMDB ファイルを開く動作には支障はありません。 正常に終了すればロックファイルは削除され ます。 尚、ファイルを排他的に開くことで、採番の ようなクリティカルな処理を制御することが あります。
お礼
ありがとうございました。
- mitarashi
- ベストアンサー率59% (574/965)
#1です。 #2さんの、 >Accessが途中で異常終了するとロックファイルが残ってしまう 排他的オープンによる確認方法は勉強させていただきました。ありがとうございました。 ただ、そこを気にするなら、mdbが開いていないのに、ロックファイルが存在している状況の処置の方が優先だと思います。 質問者様のご参考にもなると思いますので、便乗質問させていただきますが、 ゴミロックファイルがある状況で#2のコードはどう動作するのでしょうか? a.ロックファイルがあるので、誰も開いていなくてもmdbが開かない b.排他的に開くとロックファイルは削除される よろしくおねがいします。
お礼
ありがとうございました。
- nda23
- ベストアンサー率54% (777/1415)
Accessが途中で異常終了するとロックファイルが 残ってしまうので、これの存在で判断するのは 如何なものでしょうか。 ファイルを排他的に開いて、成功すれば誰もこれを 使っていないことが分かります。 Dim エラー番号 As Long On Error Resume Next Open "C:\Users\Documents\test.mdb" For Input _ Lock Read Write As #1 エラー番号 = Err.Number If エラー番号 = vbNormal Then Close #1 On Error GoTo 0 If エラー番号 = vbNormal Then MsgBox "ファイルは開かれていません" ElseIf エラー番号 = 70 Then MsgBox "ファイルは開かれています" ElseIf エラー番号 = 53 Then MsgBox "ファイルがありません" Else MsgBox "ファイルにアクセスできません" End If
お礼
頂いたコードをモジュールに張り付けたのですが、 Open "ファイルのパス" For と、Closeに、下線が引かれてしまいます。 内容は、 「メソッドの引数は、かっこで囲う必要があります」 となります。 私が貼り付ける部分が間違ってますか?
- mitarashi
- ベストアンサー率59% (574/965)
ロックファイルの存在有無で判断してはいかがでしょうか。ご参考まで。 http://support.microsoft.com/kb/208778/ja Sub test() Dim MyPath As String MyPath = "C:\Users\Documents\test.mdb" If Dir(Replace(MyPath, "mdb", "ldb")) <> "" Then MsgBox "既に開いています" End If End Sub
お礼
このコードで開いてるかどうか取得できました! ありがとうございました。
お礼
ありがとうございました。