C# / MS 访问:数据库连接错误
本文关键字:数据库连接 错误 访问 MS | 更新日期: 2023-09-27 18:30:17
我正在开发一个应用程序,该应用程序将由一小群工人(最多15个)使用,它将数据存储在Access accdb文件中。当我独自在一台机器上测试应用程序时,我没有任何问题,但是当至少有两个人不时连接到数据库时,该应用程序会向用户发出奇怪的错误。数据库存储在网络上的共享文件夹中,每个用户的应用程序都会访问该文件夹以打开数据库文件。每个用户在数据库的计算机上都有自己的系统帐户,代码中的每个函数都锁定从其他线程对数据库的访问,因此一次始终只有一次连接打开尝试。每个连接在同一函数中关闭。所有 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) 会更简单、更快?
你在这里如履薄冰。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文件是否被删除用户退出应用。同样,这可能是某种症状您的应用中有误
Mysql 是完全免费和开源的,我推荐它,因为它非常用户友好,并且对于转换部分,请使用以下内容:http://www.bullzip.com/products/a2m/info.php