4

ローカル マシンにデータを格納するために SQL Server Compact Edition 4.0 を使用する WPF アプリケーションがあります。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 に答える