检查sql server ce中是不是存在项目的最佳方法?
Posted
技术标签:
【中文标题】检查sql server ce中是不是存在项目的最佳方法?【英文标题】:Best way to check if an item exists in sql server ce?检查sql server ce中是否存在项目的最佳方法? 【发布时间】:2012-03-14 21:20:15 【问题描述】:好的,所以我基本上是在尝试确定在检查数据库中是否存在项目时哪种方式更有效。
我在带有 SQL Server CE 的 WP7 上使用 LINQ to SQL。
我将把多个对象导入数据库。现在很有可能其中一些对象已经存在于数据库中,所以我需要在每个项目进入时检查它们,如果它已经存在,则跳过它,否则添加它。
想到了两种方法。第一个是使用 foreach 并检查数据库中是否存在同名的对象:
foreach(var item in items)
//Make individual call to db for every item
var possibleItem = /*SQL SERVER STATEMENT WITH WHERE CONDITION*/;
虽然听起来相当耗费资源,但对数据库进行单独调用。所以另一个想法是对数据库中的所有对象进行完全选择并将它们存储在列表中。然后几乎用 foreach 做同样的概念,除了现在我不必连接到数据库,我可以直接访问列表。您对这些方法有何看法?有没有更好的办法?
【问题讨论】:
如果有疑问,请尝试 - 通常你应该尝试改变一些东西,这样你就不必 foreach 和检查每一个 - 在大多数情况下,你可以根据这个查询执行 Where 然后 foreach (如果你知道我的意思)但是没有代码你就不能说。但我认为 SqlCe 会在内存中做一些索引,所以它不应该比基于列表的 Where 慢(它的查询性能差 O(n)) 【参考方案1】:如果您可以轻松地对您的项目进行排序,则可以从数据库中进行选择,并在阅读数据库时逐步浏览列表以确定哪些项目是新的。在保留内存的同时,这应该比多选快得多。
using(var reader = cmd.ExecuteReader())
while(reader.HasRows && reader.Read())
var id = reader.GetInt32(0);
// test how id compares to the memory list
但如果不关心内存,为了简单起见,我可能只是将数据库中的所有键读入内存。
【讨论】:
是的,因为这是一个移动应用程序,内存是这里的关键问题。我不确定在阅读数据库时单步执行列表是什么意思。我不知道这是可能的。你是怎么做到的? 我添加了一个在命令对象上使用数据读取器的简短示例。我现在正在打电话,如果格式不好,我很抱歉。 好吧,恐怕我的深度不够了。但是有 Linq2Sql,那么为什么不创建一个查询并通过它循环出对象呢?只要没有跟踪使对象留在内存中,这应该是一样的。 @MattiasÅslund 是的,我认为这将是最好的方法。我怀疑一遍又一遍地查询数据库听起来不对。我还注意到,虽然单个请求的查询速度并不慢,但执行多个请求时确实需要更长的时间。以上是关于检查sql server ce中是不是存在项目的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章
检查 SQL Server 中是不是存在触发器的最便携方法是啥?
在 SQL Server 中检查逗号分隔字符串中是不是存在子字符串的最有效方法