public class Item
{
public int ID {get;set;}
public string SKU {get;set;
public int Quantity {get;set;}
}
我从我的数据库中提取项目,如:
List<Items> savedItems = Db.GetItems();
然后我有这个方法收集了一些项目:
public void Update(List<Items> items)
{
// update database
}
传递到Update方法项的项,这些项可能已经存在,也可能不存在于数据库中。必须使用SKU属性进行唯一性。
所以说我在数据库中有:
ID SKU qty
1 a 1
2 b 1
3 c 1
现在,如果我将一个项集合传递给Update方法,那就是:
ID=?, SKU=d, qty=1
然后它只会插入一个新项目。
如果我传入的内容如下:
ID=?, SKU=b, qty=1
然后我不会插入新项目,但我会更新ID = 2的项目。
我该怎么做?我是否应该将所有SKU值放入哈希值(如果存在),然后以某种方式找到该项并更新它?
我可以找到没有进行数据库查找的项目,因为我已经从数据库中提取了项目。
如果该项目已在数据库中,我必须更新数量。如果它不在数据库中,它就会被插入。
答案 0 :(得分:2)
基本上,你想要检查一下。首先,您将在数据库中查询是否存在具有SKU值的项目。
如果数据库中存在该值,那么您将执行更新。
如果数据库中不存在,则执行插入。
你可以稍微改变并假设更新案例,如下:
update items set ID = ..., qty = ... where SKU = ...
然后,您将检查对命令执行的ExecuteNonQuery调用的返回值。如果它返回1,那么您知道您影响了一条记录并且插入成功。如果它返回0,则该项目在数据库中不存在,您需要添加它。
这里的另一个问题是并发问题。您应该在桌面上有某种时间戳,以检查其他人是否在您持有客户端的值时对该项目进行了更改。
确保你做的另一件事是将它包装在一个事务中,这样你就可以在执行更新/插入时保证原子操作。
最后,出现的问题是为什么你不使用LINQ-to-SQL,LINQ-to-Entities,NHibernate或其他一些ORM-ish类型解决方案,它们将为你处理所有这些?