如果我不向数据库插入数据,则在重新启动时获取 SqlCeException
Posted
技术标签:
【中文标题】如果我不向数据库插入数据,则在重新启动时获取 SqlCeException【英文标题】:Getting SqlCeException on restart if I don't insert data to the DB 【发布时间】:2012-09-08 12:18:55 【问题描述】:基本上,我有一个 LINQ 数据库上下文及其模型。通常,如果数据库不存在,我会在 SQL 上下文中创建数据库(上下文是单例,每次访问它时都会检查)。
如果我在第一次启动时将数据添加到数据库,一切都会运行良好。但是如果我在应用程序的第一次启动期间没有插入任何数据,那么在连续启动时我会得到 p>
SqlCeException:指定的表不存在[TableName]
我不知道如何更具体地解释它,但是每当我在应用程序的第二次启动时执行 LINQ 查询时,如果我在第一次启动时没有插入任何数据,就会立即出现异常 /强>。如果我在第一次启动时插入了一些数据,那么在应用程序的剩余生命周期内一切都很好。为什么创建数据库并引入数据库上下文而不插入任何数据是一件坏事?
这是我的 LINQ DB 模型:
https://github.com/kypeli/Podcatcher/blob/master/wp7/Podcatcher/ViewModels/PodcastSubscriptionModel.cs如果我在第一次启动时没有插入任何数据,这就是我在第二次启动时遇到异常的地方:
https://github.com/kypeli/Podcatcher/blob/master/wp7/Podcatcher/PodcastSqlModel.cs#L64我还感到震惊的是,在 LINQ 中没有 API 调用来检查表是否存在,所以我不得不假设“这应该可以正常工作”——但事实并非如此。
有什么想法吗?谢谢! :)
更新:我验证了分析 .sdf 文件,如果我在第一次启动应用程序时不插入任何数据,确实没有创建表。在我看来:
这是 LINQ-to-SQL 中的一个错误。如果没有表存在,它不应该崩溃,但知道它应该创建它们。或者处理这种情况,只在插入数据时才建表。 我需要在第一次启动时总是在 SQL 中插入一些虚拟数据,或者... 检查表是否存在,如果不存在,则通过强制 LINQ-to-SQL 创建表来对其做出反应。但是怎么做?【问题讨论】:
我做了一些挖掘工作。我从设备上下载了 .sdf 文件,并使用 SQL Compact 查询分析器对其进行了分析。事实上,如果我不插入任何数据,则不会为 SQL 创建表,因此在第二次启动后出现错误。如果我确实插入数据,那么表格就在那里。即使调用 CreateDatabase() 也没有表对我来说似乎很奇怪。我错过了什么? 我不确定 Linq to SQL 在 WP7 中有何不同,但您可能需要在调用 CreateDatabase 后调用 SubmitChanges。 感谢您的建议,但我也尝试过,但没有任何帮助。 如果您在创建数据库后立即处理 DataContext/关闭连接怎么办?我在想 SQL CE 可能没有刷新对文件的更改,所以它可能只是坐在内存中的更改上。 【参考方案1】:我也处理过这个问题,我是这样解决的:
获取数据上下文:
dbDataContext = new DBDataContext(DBConnectionString);
if( dbDataContext.DatabaseExists() == true)
//然后尝试获取实体:
System.Data.Linq.Table<Entity> entities = dbDataContext.Tablename;
//尝试从实体中获取一个元素:
IEnumerator<Entity> enumEntity = entities.GetEnumerator();
entities.GetEnumerator();
将始终引发异常“找不到表”。
只需使用 try/catch 并在 catch 范围内删除数据库并重新创建它,因为您的数据库无论如何都是空的 :)
dbDataContext.DeleteDatabase();
dbDataContext.CreateDatabase();
dbDataContext.SubmitChanges();
【讨论】:
非常感谢弗拉德的回复!稍后我会尝试您的解决方案,但听起来这会奏效! :) 这听起来确实像是 MS 应该注意的错误... :-/ 太令人沮丧了。再次感谢! 再次感谢,这解决了问题!不过,对我来说,这听起来像是 Windows Phone 7.5 上的 LINQ-to-SQL 中的一个错误。 对于古玩,这是我解决问题的代码:github.com/kypeli/Podcatcher/commit/…以上是关于如果我不向数据库插入数据,则在重新启动时获取 SqlCeException的主要内容,如果未能解决你的问题,请参考以下文章
SqlCommand INSERT 查询不向数据库中插入数据
为啥 php mysqli 不向 Xampp 中的数据库插入数据
在 Scala Play 框架中映射 OneToMany 不向第二个表插入数据