4

我有一个 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 分钟后崩溃,但很可能介于两个极端之间。

我在谷歌上找不到任何有用的东西,因此希望这是其他人可能已经看到并有解决方法的问题。谢谢。

4

2 回答 2

3

SqlCeConnection 和相关对象不能跨线程共享,这可能就是你所面临的。每个线程创建一个新对象。

于 2013-09-03T07:13:13.877 回答
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;
    }
}
于 2013-09-09T04:57:22.640 回答