我正在用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
答案 0 :(得分:0)
如果我是你,我会在第567行的try catch
课程中放置一个DBManager
数据块,以便获取更有意义的数据。
它还允许您在异常处理块中放置一个断点,以便您可以在抛出异常之前查看正在使用的实时数据。
在同一个应用程序中对数据库进行多线程访问可能会出现问题,尤其是使用Access时。
因此,大多数人通过单例类访问数据库。
从数据库中检索数据时,由于锁定冲突,您可能会遇到异常。
答案 1 :(得分:0)
不幸的是,事实证明,在您的应用程序中,在任何时刻都只能与任何数据库文件建立连接。
现在我锁定所有文件只需一个锁即可访问所有文件(因此只有一个线程可以访问任何文件)而且我不再收到错误了!
遇到同样问题的人的特定代码示例:
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
}
一旦这个块完成,另一个方法可以用同样的方式锁定对数据库的访问