访问 SQL CE 数据库的线程安全方式
Posted
技术标签:
【中文标题】访问 SQL CE 数据库的线程安全方式【英文标题】:Thread Safe way to access SQL CE Database 【发布时间】:2012-02-08 15:06:13 【问题描述】:背景:
在我的 windows phone 项目中。我使用本地 SQL CE 数据库来存储日期。使用 LINQ to SQL 以编程方式创建数据库表。
通过几个线程中的各种数据上下文实例访问该数据库。
问题来了:
我为我的应用程序的用户提供了删除所有数据和注销的选项。当用户选择它时,我使用 datacontext 的 DeleteDatabase 方法删除数据库。但是,我总是收到数据库正在被另一个进程使用的错误,因此无法删除。
任何朝着正确方向的轻推都会让我开心。
【问题讨论】:
当您调用 Delete DB 时,您是否还有任何连接处于打开状态?最有可能是您的进程可以访问数据库而不是其他东西。 好吧,我关闭了所有我知道可以打开的连接。有没有办法获取正在使用数据库的进程并杀死它们? 您是否将 DataContext 的所有实例包装在 using 语句中和/或处置它们? @ErikEj 感谢您指出这一点。我忽略了一个没有使用“使用”语句的实例。改变它解决了这个问题。就像我说你让我开心:) 【参考方案1】:如上所述,安迪(老实说,他们打败了我)问题是在另一个进程仍然打开连接时访问数据库。基本上,可以通过将针对数据库运行的任何代码放在 using 块中来轻松修复,如下所示:
using (MyDataContext db = new MyDataContext("isostore:/MyData.sdf"))
//Run database logic here
我想从某种意义上说,它对错误很有意义。在 WP7 中打开的文件也会发生同样的情况。
有关更多信息和示例,请查看此page。
【讨论】:
嗨,我试过这种方式,我的意思是我在任何地方都使用了 using 块,但是当我试图删除数据库时它仍然给我错误。以上是关于访问 SQL CE 数据库的线程安全方式的主要内容,如果未能解决你的问题,请参考以下文章