2012-04-07 17 views
4

私は小さなワーカーチーム(最大15人)が使用するアプリケーションを開発しており、Access accdbファイルにデータを格納しています。私は1台のマシンで自分でアプリケーションをテストしているときに問題はありませんが、少なくとも2人がdbに接続しているときに、アプリケーションがユーザーに奇妙なエラーを出すことがあります。データベースはネットワーク上の共有フォルダに保存され、各ユーザーのアプリケーションはそのフォルダにアクセスしてdbファイルを開きます。各ユーザはdbのマシン上に独自のシステムアカウントを持ち、コード内の各機能は他のスレッドからdbへのアクセスをロックするので、一度に1つの接続開始試行が常に1つしかありません。各接続は同じ機能で閉じられています。すべてのdb関数は1つのシングルトンクラスで記述されています。C#/ MSアクセス:データベース接続エラー

私が取得エラー:

System.Data.OleDb.OleDbException (0x80004005): Could not use 'D:\Shared\nscm\nscm_db.accdb'; file already in use. 

System.Data.OleDb.OleDbException (0x80004005): Cannot open database ''. It may not be a database that your application recognizes, or the file may be corrupt. 

System.Data.OleDb.OleDbException (0x80004005): Too many active users. **(this error even when there's only two users!)** 

これは狂気私を運転しています。 JET4/ACEエンジンでは、マルチユーザーアクセスを適切にサポートしていないという問題がありますか?

私はMS SQL Server ExpressやMySQLのような何かにdatabseを変更することを考えていますが、どちらが移行するのが最も簡単で、どちらが本当に無料であるか分かりません。

ご協力いただきありがとうございます。

更新日: データ変換は私にとって問題ではありません。アプリはまだ開発中ですので、実際のデータはありません。私は、コードとSQ​​Lクエリの変更についてもっと心配しています。他のDBテクノロジに切り替えた後に他の問題に遭遇しないかどうかはわかりません。

私の本当の疑問は、現在の技術で何かを修正しようと努力し続けるべきか、私は使用しているのか、それともAccess dbエンジンに関する既知の問題があるのか​​、それをもっと無駄にするのは無駄です。いくつかの種類のdbサーバー(MySQL)を使用するのが速くなりますか? http://www.bullzip.com/products/a2m/info.php

+0

msアクセスGUIを開いてalter tableページを開いたままにしましたか? – nawfal

答えて

0

MySQLは、それは非常にユーザーフレンドリーと変換する部品の使用のために、このですので、私はお勧めされ、完全に無料でオープンソースです。 MSAccessはユーザーベースをサポートする必要がありますが、これは異なる種類のデータベースに移行することを検討できるシナリオです。つまり、ファイルベースのデータベースではなく、クライアント/サーバーのデータベースです。結局のところ、現在15人のユーザーがいれば、この数字が大きくなり、ファイルベースのデータベースの問題が指数関数的に増加する可能性があります(うまくいけば)。

移行を選択した場合、SQLServer ExpressとMySqlの両方が無料であると言えるでしょう。
私はSQL Server Expressをお勧めします。そのT-SQL構文はJET-SQLと互換性がありますが、クエリ構文でVBAキーワードを使用する場合は特に違いがあります。
コードの観点から、私はOleDbProviderを放棄し、SqlServerのネイティブプロバイダを使用することを推奨します。したがって、OleDbConnection、OleDbCommandなどをすべてSqlConnection、SqlCommand(これはMySqlを選択した場合も同様です)で変更する必要があります。これらの変更はむしろ機械的で反復的なものなので、大きな問題はありません。しかし、あなたが同じ結果を保証するためにあなたのコードを持っているすべてのデータアクセスクエリを再テストする必要があり、エラーについて

を返されます。

  • Too many active users - これは接続しませ によって発信することができ
  • 正しく閉じられCannot open database - データベースが破損しているか、 2GB制限に達しましたか?
  • Could not use - あなたのすべての ユーザーがアプリを終了した後でLDBファイルが削除されているかどうかを確認します。これもまた、何かがあなたのアプリで が間違っているという症状かもしれません。
3

あなたがここに薄い氷の上を歩いている:

+0

** 1。**私はそれぞれの関数で 'connection.Close()'を使っています。私はもっ​​と何かをすべきか? ** 2。** 2GBに達していません。このアプリはまだ使用されておらず、ちょうどテストされているので、dbには約12MBのテストデータしか含まれていません。 ** 3。**私はdbエンジンがLDBファイルを単独で管理していると思った。そして、はい、すべてのユーザーがアプリケーションを閉じる時に削除されます。 – Val

+1

通常、私は近いうちに使用しません。例外が発生した場合でも接続を閉じることが保証されている 'using'文が好きです。私が言ったように、あなたのユーザベースはMSAccessデータベースの可能性にありますが、あなたが持っているすべてのデータアクセスを再確認してください。 – Steve

+0

私は 'using'ステートメントを追加するコードを変更しています。これには数日かかることがあります。私はそれをテストし、それがどのように動作するかを見ていきます。 – Val

関連する問題