1

Access 2003 Pro(ビルド11.8321.8324)SP3でテスト済み。

再現する手順:

  • 新しいデータベースを作成します。
  • 新しいフォームを作成します。
  • フォームにボタンを置きます。
  • ボタンのClickイベントプロシージャに次のコードを貼り付けます。

Debug.Print Workspaces.Count
Debug.Print CurrentDb.Name

  • コードエディタとフォームを閉じて、変更を保存します。
  • この手順をスキップしないでください:Accessを閉じます。
  • Accessとデータベースを再度開きます。
  • フォームを開く
  • ボタンをクリックします
  • ツールバーボタンをクリックして、フォームをデザインモードに切り替えます。

次のエラーダイアログが表示されます。

現時点では、データベースへの排他的アクセス権はありません。変更を進めると、後で保存できない場合があります。

エラーダイアログにアクセス

ここで何が起こっているのか誰か知っていますか?

4

1 に答える 1

0

簡単な回避策は、Workspaces を初めて呼び出す前に CurrentDb を呼び出すことです。

Debug.Print CurrentDb.Name
Debug.Print Workspaces.Count
Debug.Print CurrentDb.Name

何が起こっているのかをわかりやすく説明しますが、これは私の理論にすぎません。

Access ヘルプ ファイルの関連部分は次のとおりです (CurrentDb の場合)。

メモ 以前のバージョンの Microsoft Access では、構文 DBEngine.Workspaces(0).Databases(0) または DBEngine(0)(0) を使用して、現在のデータベースへのポインターを返すことができました。Microsoft Access 2000 では、代わりに CurrentDb メソッドを使用する必要があります。CurrentDb メソッドは現在のデータベースの別のインスタンスを作成しますが、DBEngine(0)(0) 構文は現在のデータベースの開いているコピーを参照します。CurrentDb メソッドを使用すると、現在のデータベースを参照する Database 型の変数を複数作成できます。Microsoft Access は引き続き DBEngine(0)(0) 構文をサポートしますが、マルチユーザー データベースでの競合を回避するために、コードにこの変更を加えることを検討する必要があります。

Workspaces コレクションの場合:

Workspace オブジェクトを初めて参照または使用するときに、既定のワークスペースである DBEngine.Workspaces(0)が自動的に作成されます。

CurrentDb への最初の呼び出しの前に既定のワークスペースを作成することで、CurrentDb がどのように機能するかを何らかの形で忘れさせているようです。現在のデータベースの新しいインスタンスを作成する代わりに、デフォルトのワークスペースに既にあるインスタンスを使用しているようです。

もちろん、これはすべて推測であり、「本当の答え」を知りたいと思っています。

于 2010-10-21T16:24:44.347 に答える