C#桌面应用程序在访问Access数据库(mdb)时出错



我正在用C#编写一个桌面应用程序。它使用的是MS Access mdb数据库。我时不时地会遇到一些奇怪的错误,比如下面的错误。我有几个线程访问数据库,但它们都锁定了访问(使用lock()关键字)。

这让我抓狂,因为我甚至不知道是什么原因导致了错误,也不知道在哪里寻找原因。有没有人有类似的经历,可以给我一些提示?

当应用程序试图从数据库中读取一些数据时,出现了这个:

System.InvalidOperationException:内部.Net框架数据提供程序错误12。在System.Data.ProviderBase.DbConnectionInternal.CreateReferenceCollection()在System.Data.ProviderBase.DbConnectionInternal.AddWeakReference(对象值,Int32标记)System.Data.OleDb.OleDbConnection.AddWeakReference(对象值,Int32标签)System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior行为,字符串方法)System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior行为)位于的System.Data.OleDb.OleDbCommand.ExecuteReader()nscm。中的DBManager.RetrieveUpdates(Int32 lastRetrievedUpdateId)c: \Users\myaccount\WORKSPACE\SharpDevelop_Projects\myapp\Classes\Data\DBManager.cs:line567

如果我是你,我会在第567行附近的DBManager类中放置一个try catch块,以便捕获一些更有意义的数据。

它还允许您在异常处理块中放置断点,这样您就可以在抛出异常之前查看正在使用的实时数据。

从同一应用程序中对数据库进行多线程访问可能会遇到问题,尤其是使用access。

出于这个原因,大多数人都通过singleton类访问数据库。

从数据库检索数据时,可能由于锁定冲突而遇到异常。

看来,我已经解决了这个问题。我的应用程序有两个单独的mdb文件和两个独立的后台线程,每个线程分别访问自己的mdb(一个线程使用一个文件,另一个使用另一个文件)。我一开始的错误假设是,如果这些线程单独工作并访问单独的文件,就不会有问题。

不幸的是,在您的应用程序中,任何时候都只能有一个到任何数据库文件的连接。

现在,我只为所有线程锁定一个锁,就可以锁定对所有文件的访问(所以只有一个线程可以访问任何文件),我再也不会收到错误了!

遇到相同问题的特定代码示例:

Object dbLock = new Object(); //make it a field in the database managing singleton class

在任何线程使用的方法中:

lock(dbLock) //lock out db access from other threads (reserve for this thread only)
{
   //here goes some code which will run only when the thread manages to lock the dbLock
   //this code should accesses your database by creating and opening
   //a new connection and then closing it in the same block
}

一旦这个块完成,另一种方法可以像

一样锁定对数据库的访问

最新更新