2

ドキュメントから、私は adModeShareDenyWrite がその方法であると期待していますが、正しく機能していません。

ADO 経由で Access データベースを使用しています。私の接続文字列は Mode=8 で、これは adModeShareDenyWrite です。しかし、テーブルから行を削除しようとすると、次のようになります。

詳細不明のエラー、説明: 指定されたテーブルから削除できませんでした。、ソース: Microsoft JET データベース エンジン

つまり、この設定により、ME は自分の接続を使用してデータベースを更新できなくなります。

同じことを報告している Web 上の他の投稿をいくつか見つけました。

管理者がアクセス許可を変更する必要のないソリューションを探しています。私のプログラムが制御できるものである必要があります。

ここでの私の動機は、データベースが破損する可能性を最小限に抑えることです。Microsoft が文書化した mdb ファイルの破損の原因の 1 つは、2 つのアプリが同じデータベースに書き込むことです。そのため、1 つのアプリのみがデータベースへの書き込み接続を持つことができるようにしたいと考えています。他の人は読むことができますが、書き込もうとすると失敗するはずです。最初に接続を確立した人が勝ちます。

4

5 に答える 5

2

コーリー・トレーガーは次のように書いています。

ここでの私の動機は、データベースが破損する可能性を最小限に抑えることです。Microsoft が文書化した mdb ファイルの破損の原因の 1 つは、2 つのアプリが同じデータベースに書き込むことです。そのため、1 つのアプリのみがデータベースへの書き込み接続を持つことができるようにしたいと考えています。他の人は読むことができますが、書き込もうとすると失敗するはずです。最初に接続を確立した人が勝ちます。

なぜあなたはそれについて心配しているのですか?Jet はデフォルトでマルチユーザー データベース エンジンです。他の誰かがテーブルを更新している場合、関連するデータ ページは読み取り専用としてロックされます (書き込みが開始される前の状態で)。

単なるマルチユーザー操作による破損を恐れる現実的な理由はありません。通常、Jet データベースの破損は、接続の切断または書き込み中の接続の中断が原因で発生します (ユーザーが必要な速度で応答しないアプリを強制終了するなど)。

腐敗に対するあなたの恐れは的外れだと思います。

一方、排他ロックで開くことはできるはずですが、なぜ機能しないのかわかりません。ADO の代わりに DAO を使用して Jet データを操作することを検討しましたか? これが (汎用インターフェイス レイヤーではなく) ネイティブ データ インターフェイスであることを考えると、より簡単なはずです。

于 2008-10-04T21:08:36.427 に答える
0

Corey Trager は次のように書いています。

管理者がアクセス許可を変更する必要のないソリューションを探しています。私のプログラムが制御できるものである必要があります。

問題の原因が NTFS アクセス許可がユーザーに対して読み取り専用であることが原因である場合、MDB を書き込み可能にするためにできることはありません。MDB の保存場所 (サーバー上またはローカル ハード ドライブ上) は指定しませんが、いずれの場合でも、ユーザーが MDB に対する書き込みアクセス許可を持つには、それを許可するように NTFS アクセス許可を設定する必要があります (共有の場合)。サーバーでは、SHARE と基になるファイルの両方で許可する必要があります)。ローカル ファイルの場合、最善の解決策は、ユーザー レベルのログオンが完全な書き込みアクセス許可を持つ場所にファイルを保存していることを確認することです。これは、ユーザー プロファイルのどこにでもあり、それ以外の場所にはほとんどありません。

そうは言っても、これがあなたの問題の原因であることを本当に示唆しているわけではありません(私は本当にどちらとも言えません)、それが原因である場合、あなたができることは何もないことを指摘しているだけです.プログラムでそれを回避します。

于 2008-10-03T19:23:36.827 に答える
0

複数のユーザーがネットワーク経由で Access データベースに接続している場合は、Access を使用する代わりに SqlServer にアップグレードすることを検討してください。

于 2008-10-14T20:19:48.487 に答える
0

1 つの解決策は、データベースのコピーへのアクセスを許可することです。彼らは好きなように変更できますが、マスターにコピーすることはできません。

于 2008-10-02T22:06:52.860 に答える
0

ここで、クライアント インターフェイスから MDB ファイルにアクセスするとします。それが何であれ、他のユーザーも同じファイルに同時に接続できます。接続モードで adModeShareDenyWrite を使用すると、データを他のユーザーと共有できますが (MDB ファイル内のテーブルまたはレコードに対するロックは一切行われません)、データを変更することはできません (これがエラーが発生する理由です)。 )。

1 つの解決策は、次のような方法で接続パラメーターを管理することです。

(where you have a user object with a '.role' property, or anything equivalent ...)
if activeUser.role = "admin" then
    m_connectionMode = adModeWrite
else
    m_connectionMode = adModeShareDenyWrite
endif

次に、パラメーター m_connectionMode を使用して ADO 接続を開くことができます。管理者には挿入/更新/削除の権限が与えられますが、他のユーザーはデータを表示することしかできません。これは、プログラムのどこかに、または理想的にはテーブルに、アプリケーションで誰が何を示しているかを示すデータがあることを意味します。

編集: Corey との複数のコメントに続いて:

やりたいことが真っ直ぐにできなくなる。私の提案: アプリがデータベースにアクセスするとき、.mdb フォルダー内の特別なファイルをチェックします (ファイルが何であれ)。

このファイルが存在する場合、アプリは「読み取り専用」接続を開きます。

このファイルが存在しない場合、アプリはファイルを作成し (「transferDatabase」などで作成できます)、読み取り/書き込み接続を開きます。アプリを終了したら、ファイルを破棄します。

于 2008-10-02T22:27:55.837 に答える