tsukanon
@tsukanon

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C#からOLEDBを介してaccessファイルに接続するときエラーになります

解決したいこと

C#からOLEDBを介してaccessファイルに接続しています。
accessファイルは1台のPC(Windows10)に共有フォルダを作成して、
そのファイルを10台くらいで共有しているのですが、
同時に接続するタイミングが悪いと
OleDbDataAdapter.Fill(DataTable);

OleDbConnection.Open();
のときエラーになります。
(競合しない限りはエラーになりません)

Try Catchで処理する以外の、他の解決策はありますでしょうか?
例えば、「接続できない」、「開けない」などを判定して、できないときは終了する
例えば、Accessファイル側に何か設定をする
など

ご回答よろしくお願いいたします。

発生している問題・エラー

System.Data.OleDb.OleDbException (0x80004005): このデータベースは、マシン '******' のユーザー 'Admin' が開いています。データベースが使用可能になった時点で、再度実行してください。
System.Data.OleDb.OleDbException (0x80004005): ファイル '******.accdb' を開くか、書き込むことができませんでした。他のユーザーが排他的に開いているか、データの表示と書き込みを行う権限がありません。
System.Data.OleDb.OleDbException (0x80004005): マシン '******' のユーザー 'Admin' がデータベースを開けない状態、またはロックできない状態にしています。

該当するソースコード

using OleDbConnection cn = new OleDbConnection(******);
using System.Data.DataTable table = new System.Data.DataTable();
using OleDbCommand sqlCm = cn.CreateCommand();
using OleDbDataAdapter adapter = new OleDbDataAdapter(sqlCm);

sqlCm.CommandText = "***SELECT句***";
adapter.Fill(table); //←ここでエラーになる

自分で試したこと

今はTry Catchで凌いでいます。

0

2Answer

コード実行時にAccessで該当ファイルを開いていたりしますか?同様のことはメモ帳などに履歴が残っているときに、Fileクラスでファイルの読み書きを行うと起きます。

0Like

Comments

  1. @tsukanon

    Questioner

    @mu-MueLangDeveloperさん、ありがとうございます。

    Accessファイルを開くこともありますが、ほとんどありません。
    少なくともエラーが出たときは開いていなかったと思います。

    10台くらい同時にC#のコードから
    ネットワーク上の同じAccessファイルをSELECTしにいくので
    エラーになってしまうのかなと推測していました。

  2. どうすればいいかわからなかったので、Perplexityに聞いてみたところ、上のコードの場合、cn.State.HasFlag(ConnectionState.Excuting)でデータベースの操作が実行されているか真偽値で返されるそうなので、それで条件分岐すればできそうです。でも、同時に実行される可能性があるのでtry-catch文で処理した方が良いと考えています。

  3. @tsukanon

    Questioner

    調べてみましたらConnectionState 列挙型には
    他にも、ClosedやOpenもあるみたいですね。
    これで判定できるか、一通り試してみたいと思います。

    大変参考になる情報をありがとうございました!

  4. @tsukanon

    Questioner

    Excutingは、バージョン.Net 8 ではまだ実装されていないようでした。
    ClosedやOpenは、今の OleDbConnection cn の状態ですし。
    当面は try catch で処理することにしようと思います。

    無題.png

接続しているAccessのファイルを置いてあるフォルダを開いておいて
エラーが出るときにロック用ファイル(同名で拡張子が異なるファイル)が存在してますか?

エラー内容からして別の所から接続されていると思われます
AIに確認方法を聞くと

Windowsの場合、共有フォルダのプロパティを開き、「開いているファイル」タブを表示することで、現在ファイルを開いているユーザーを確認できます。

とのことなので試して見て下さい

0Like

Your answer might help someone💌