C#/MS Access:数据库连接错误
我正在开发一个应用程序,将由一个小团队(最多15人)使用,它将数据存储在Access accdb文件中。当我在一台机器上独自测试应用程序时,我没有任何问题,但当至少有两个人不时连接到db时,应用程序会给用户带来奇怪的错误。数据库存储在网络上的共享文件夹中,每个用户的应用程序都会访问该文件夹以打开数据库文件。每个用户在db的机器上都有自己的系统帐户,代码中的每个函数都会锁定从其他线程对db的访问,因此每次只有一次打开连接的尝试。在同一个函数中关闭每个连接。所有db函数都写在一个单例类中 我得到的错误是:C#/MS Access:数据库连接错误,c#,ms-access,C#,Ms Access,我正在开发一个应用程序,将由一个小团队(最多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查询中的变化。我不确定切换到其他db技术后是否不会遇到其他问题
我真正的问题是:我是否应该继续努力纠正当前技术中的某些问题,我正在使用Access db引擎,或者Access db引擎存在已知问题,在这方面浪费时间是毫无意义的。开始使用某种db服务器(MySQL)会更简单、更快?MySQL是完全免费和开源的,这是我推荐的,因为它对用户非常友好,对于转换部分,请使用以下命令:您在这里走的是薄冰。MSAccess应该支持您的用户基础,但这是一个可以考虑迁移到不同类型数据库的场景。我的意思是,不是一个基于文件的数据库,而是一个客户机-服务器数据库。毕竟,如果您现在有15个用户,那么这个数字可能(希望)会增长,并且基于文件的数据库的问题将以指数级增长 如果您选择迁移,我可以说SQLServerExpress和MySql都是免费的。
在您的情况下,我推荐SQL Server Express。它的T-SQL语法与JET-SQL更兼容,但存在一些差异,特别是在查询语法中使用VBA关键字时。
从代码的角度来看,我建议放弃OleDbProvider,开始使用SqlServer的本机提供程序。因此,您需要更改等效SqlConnection、SqlCommand中的每个OleDbConnection、OleDbCommand等(如果您选择MySql,也是如此)。这些变化是相当机械和重复的,所以这里没有大问题。但是,您应该重新测试代码中的每个数据访问查询,以确保返回相同的结果 关于错误:
-这可能是由于连接不正确引起的 正确关闭活动用户太多
-数据库已损坏或您已到达 2GB限制无法打开数据库
-检查在执行所有操作后是否删除了LDB文件 用户退出应用程序。这也可能是一种症状 你的应用程序中存在错误无法使用
connection.Close()
。我应该多做点什么吗?2.我还没有达到2GB。该应用程序尚未使用,只是测试过,因此数据库中只包含一些测试数据,大约为12MB。3.我认为db引擎自己管理LDB文件。是的,当所有用户关闭应用程序一段时间后,它会被删除。通常我不使用close,我更喜欢using
语句,该语句保证在遇到异常时也会关闭连接。正如我所说的,您的用户群可能是MSAccess数据库,但请仔细检查您拥有的每个数据访问,确保尝试..捕获所有内容或在一次性对象上使用using
。我正在更改代码以添加using
语句。这可能需要几天时间。然后我会测试它,看看它是如何工作的。我花了一个星期的时间修改代码。现在它使用using
语句,我仍然得到错误。今天我将尝试最后一件事,然后转向基于服务器的db技术。我已经在下载SQL Server Express 2008和2012。您是否已打开ms access GUI并保持alter table页处于打开状态?