我正在开发一个应用程序,它将由一小组工作人员(最多15个)使用,并将数据存储在Access accdb文件中。当我在一台机器上单独测试应用程序时,我没有任何问题,但是当有时至少有两个人连接到数据库时,应用程序会给用户带来奇怪的错误。数据库存储在网络上的共享文件夹中,每个用户的应用程序访问该文件夹以打开db文件。每个用户在db的计算机上都有自己的系统帐户,并且代码中的每个函数都锁定从其他线程访问db,因此一次只能尝试一次连接打开。每个连接在同一功能中关闭。所有db函数都写在一个单例类中。
我得到的错误:
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,但我不知道哪一个最容易迁移到哪些,哪些是真正免费的。
提前感谢您的帮助和关注!
更新: 数据转换对我来说不是问题。该应用程序仍处于开发阶段,因此没有真正的数据。我更担心代码和SQL查询的变化。我不确定在切换到其他数据库技术后是否会遇到其他问题。
我真正的问题是:我是否应该继续努力纠正当前技术中的某些内容,我正在使用或者是否存在Access数据库引擎的已知问题,并且浪费我的时间在这上面会毫无价值它会更简单,更快捷开始使用某种数据库服务器(MySQL)?
答案 0 :(得分:3)
你在这里走在薄冰上。 MSAccess应该支持您的用户群,但是您可以考虑迁移到不同类型的数据库。我的意思是,不是基于文件的数据库,而是客户端 - 服务器数据库。毕竟,如果你现在拥有15个用户,那么(希望)这个数字可能会增长,并且基于文件的数据库的问题将呈指数级增长。
如果您选择迁移,我可以说SQLServer Express和MySql都是免费的 在您的情况下,我推荐SQL Server Express。它的T-SQL语法与JET-SQL更兼容,但是在您的查询语法中使用VBA关键字时会出现一些差异。 从代码的角度来看,我建议放弃OleDbProvider并开始使用SqlServer的本机提供程序。因此,您需要在等效的SqlConnection,SqlCommand中更改每个OleDbConnection,OleDbCommand等(如果您选择MySql也是如此)。这些变化相当机械和重复,所以这里没有大问题。但是,您应该重新测试代码中的每个数据访问查询,以确保返回相同的结果
关于错误:
Too many active users
- 这可能是由连接而不是
正确关闭Cannot open database
- 数据库损坏或您已达到
2GB限制?Could not use
- 检查LDB文件是否全部删除后删除
用户退出应用程序。这又可能是一种症状
您的应用中存在错误答案 1 :(得分:0)
Mysql是完全免费和开源的,我推荐它,因为它非常用户友好,转换部分使用它:http://www.bullzip.com/products/a2m/info.php