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

时间:2012-02-22 10:24:11

标签: c# ms-access thread-safety ms-access-2007

我正在用C#编写桌面应用程序。它正在使用MS Access mdb数据库。我不时会遇到类似下面的错误。我有一些线程访问数据库,但他们都锁定了访问权限(使用lock()关键字)。

这让我疯狂,因为我甚至不知道什么可能导致错误以及在哪里寻找原因。任何人都有类似的经历,可以给我任何提示吗?

当应用尝试从数据库中读取一些数据时,会出现这个:

  

System.InvalidOperationException:内部.Net Framework数据   提供商错误12. at   System.Data.ProviderBase.DbConnectionInternal.CreateReferenceCollection()   在   System.Data.ProviderBase.DbConnectionInternal.AddWeakReference(对象   value,Int32 tag)at   System.Data.OleDb.OleDbConnection.AddWeakReference(Object value,Int32   标签)   System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(的CommandBehavior   行为,String方法)at   System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)   在System.Data.OleDb.OleDbCommand.ExecuteReader()at   nscm.DBManager.RetrieveUpdates(Int32 lastRetrievedUpdateId)in   C:\ Users \用户我的账户\ WORKSPACE \ SharpDevelop_Projects \ MYAPP \ Classes_Data \ DBManager.cs:线   567

2 个答案:

答案 0 :(得分:0)

如果我是你,我会在第567行的try catch课程中放置一个DBManager数据块,以便获取更有意义的数据。

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

在同一个应用程序中对数据库进行多线程访问可能会出现问题,尤其是使用Access时。

因此,大多数人通过单例类访问数据库。

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

答案 1 :(得分:0)

好像,我已经解决了这个问题。我有两个单独的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
}

一旦这个块完成,另一个方法可以用同样的方式锁定对数据库的访问