Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#/MS Access:数据库连接错误_C#_Ms Access - Fatal编程技术网

C#/MS Access:数据库连接错误

C#/MS Access:数据库连接错误,c#,ms-access,C#,Ms Access,我正在开发一个应用程序,将由一个小团队(最多15人)使用,它将数据存储在Access accdb文件中。当我在一台机器上独自测试应用程序时,我没有任何问题,但当至少有两个人不时连接到db时,应用程序会给用户带来奇怪的错误。数据库存储在网络上的共享文件夹中,每个用户的应用程序都会访问该文件夹以打开数据库文件。每个用户在db的机器上都有自己的系统帐户,代码中的每个函数都会锁定从其他线程对db的访问,因此每次只有一次打开连接的尝试。在同一个函数中关闭每个连接。所有db函数都写在一个单例类中 我得到的错

我正在开发一个应用程序,将由一个小团队(最多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文件 用户退出应用程序。这也可能是一种症状 你的应用程序中存在错误

1。我只是在每个函数中使用
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页处于打开状态?