我有一个用户在使用我的应用程序时报告此错误。
该应用程序是在Windows XP Embedded上运行的.NET Winforms应用程序,使用SQL Server CE 3.5 sp1和Linq-To-SQL作为ORM。数据库本身位于我的应用程序在My Documents
文件夹中创建的子目录中。用户帐户是系统上的管理员帐户。没有其他应用程序或进程连接到数据库。
在大多数情况下,该应用程序似乎运行良好。它启动,可以从数据加载数据并将数据保存到数据库。用户每天使用该应用程序访问数据库可能需要几百次。他们得到了这个错误,但只是间歇性的。也许一天3-4次。
在代码本身中,对数据库的所有调用都使用包含在using
子句中的Linq-To-SQL数据上下文。换句话说:
using(MyDataContext db = new MyDataContext(ConnectionString))
{
List<blah> someList = db.SomeTable.Where(//selection criteria).ToList();
return(someList);
}
这就是几乎所有对数据库的调用都是这样的(除了保存数据的那些显然没有选择并返回任何东西)。正如我之前提到的,它们在99%的情况下没有问题,但每天只能获得共享内存错误几次。
我当前的“修复”是在应用程序启动时我只是读取数据库中的所有数据(不是很多)并将其缓存在内存中并将我的数据库调用转换为从内存列表中读取。到目前为止,这似乎解决了这个问题。现在他们已经报了一天半没有问题。但这仍然困扰着我,因为我不知道什么会导致错误。
虽然应用程序每天访问数据库几百次,但它通常不是快速连续的。通常每隔几分钟至少一次。但是,有一个用例可能会尽可能快地一个接一个地调用两个。换句话说,比如:
//user makes a selectio n on the screen
DatabaseCall1();
DatabaseCall2();
这两个都将遵循上面代码块中的模式,它们创建新的上下文,工作,然后返回。但是这些调用不是异步的,所以我希望在调用DatabaseCall2之前关闭和处理连接。但是,可能是SQL Server CE端的某些内容没有足够快地关闭连接?它可以解释为什么它是间歇性的,因为大多数时候它可能没有问题?我还应该提到,没有修复的这个确切的程序安装在具有完全相同的硬件和软件的几个其他系统上(它们是彼此的克隆),并且其他系统的用户没有报告任何错误。
我一直在摸不着头脑,因为我无法在我的开发机器或测试机器上重现此错误,并且在这里和其他地方回答有关此异常的问题通常围绕用户权限不足或共享数据库网络文件夹。
答案 0 :(得分:0)
查看上一篇文章,我想你会找到答案: -
SQL Server CE - Internal error: Cannot open the shared memory region