我有一个WPF应用程序,它使用SQL Server Compact Edition 4.0在本地计算机上存储数据。我正在经历Compact Edition 4.0数据库中随机但相当频繁的崩溃。它总是给出相同的错误....
Attempted to read or write protected memory. This is often an indication that other
memory is corrupt.
......使用以下有限的堆栈跟踪...
at System.Data.SqlServerCe.NativeMethodsHelper.SafeRelease(IntPtr& ppUnknown)
at System.Data.SqlServerCe.SqlCeCommand.ReleaseNativeInterfaces()
at System.Data.SqlServerCe.SqlCeCommand.Dispose(Boolean disposing)
at System.Data.SqlServerCe.SqlCeCommand.Finalize()
我有一个单独的线程,我用于所有CE数据库调用,所以我知道我的所有数据库调用都是序列化的(没有对数据库的并发调用),它们都发生在同一个线程上。发生异常时,它始终具有上述详细信息。
它不可重复,但经常发生,我的应用程序永远不会存活超过10分钟。有时它会在最初几秒内崩溃,有时甚至会在运行10分钟后崩溃,但很可能介于两个极端之间。
我找不到谷歌搜索中有用的东西,所以希望这是其他人可能已经看到的问题,并有一个解决方法。感谢。
答案 0 :(得分:3)
无法跨线程共享SqlConnection和相关对象,这可能就是您所面临的问题。为每个线程创建一个新对象。
答案 1 :(得分:1)
经过多次实验,我发现在事务中包装数据库调用解决了这个问题。所以不是像这样的原始代码......
using (AMSDBContext context = CreateDatabaseContext())
{
// actual operation code called here...
context.SaveChanges();
}
我现在执行以下操作,因为它没有崩溃......
using (AMSDBContext context = CreateDatabaseContext())
{
if (context.Connection.State != System.Data.ConnectionState.Open)
context.Connection.Open();
EntityConnection entityConnection = (EntityConnection)context.Connection;
using (EntityTransaction tx = entityConnection.BeginTransaction())
{
// actual operation code called here...
context.SaveChanges();
tx.Commit();
return ret;
}
}