1

アクセス データベース (.accdb) からのデータをクライアント アプリに提供する、Java で記述された単純なサーバーがあります。

データは、リンクされた Excel ワークブック (.xlsx) 内の複数のワークシートのデータを結合するデータベース内のクエリから取得されます。

Excel ワークブックは所有者によって定期的に更新される必要があり、データベースは一定の稼働時間が必要であり、データベースが開いているときに Excel がファイルをロックするため、これはうまくいきませんでした。

そこで、この問題を回避するために、ワークブックのコピーから実行するようにデータベースを変更しました。Javaサーバーを強制終了するバッチスクリプトを作成したため、データベースへの接続が閉じられ、コピーされたExcelワークブックのロックが解除されました。次に、元のコンテンツをコピーしたファイルの場所にコピーし、サーバーを再起動して、データベース内のデータを更新します。このバッチ ファイルを毎日実行するように Windows タスク スケジューラを設定しました。

ずさんな解決策ですが、うまくいきました。とか、そう思いました。バッチ ファイルは 1 回だけ実行され、それ以降実行されていません。

だから、これに別の絆創膏を投げる前に、ここで聞いてみようと思いました. 特定のユーザーがファイルにアクセスする必要があるときにすべての接続を閉じるように元の Excel ワークブックをセットアップする方法はありますか? それができれば、切断後にサーバーに再接続を試行させるだけで済みますが、これは難しいことではありません。

4

1 に答える 1

0

私はこれを熟考してより良い解決策にたどり着こうとしてきましたが、私のマシンではあなたが説明したような問題はありませんでした. サーバーとクライアントは別のマシン上にありますか? ブック内の何かを更新すると、Access は自動的にそれを認識しますが、それらはすべて同じコンピューター上で開いています。その時点で、Access は実際にはデータに対して何もしていなかった可能性があります。

いずれにせよ、コピーを引き続き使用することを検討し、このマクロを ThisWorkbook オブジェクトの下に追加することをお勧めします。

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
 ' code to overwrite the databasecopy here
 ' use the Shell() procedure to run system commands to shutdown the database connections
 ' as you need
End Sub 

この方法では、サーバーをシャットダウンする必要がある場合がありますが、少なくとも、ワークブックが更新されたときにのみ、すぐにシャットダウンできます。

また、あなたが尋ねた実際の質問について調べましたが、正確なものは見つかりませんでした。次のようなことを試すことができるかもしれません:

Set ActiveWorkbook.Connections() = Nothing

接続のインデックスを把握できる場合。または、それらすべてを反復処理してから、後で再開することもできます。現時点で、このソリューションが機能するかどうかを試してみる時間はもうありません。うまくいけば、それはあなたを正しい足に導きます.

于 2012-06-28T04:51:56.023 に答える