2009-12-28 103 views
0
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 

現在,如果我通過一個項目收集到的更新方法,即有:

ID=?, SKU=d, qty=1 

然後它只是插入一個新的項目。

如果我通過在看起來像一個項目:

ID=?, SKU=b, qty=1 

那麼我不會插入一個新的項目,但我將更新ID = 2的項目。

我該怎麼做?我應該把所有的SKU值放到一個散列中,如果它存在,那麼以某種方式找到它並更新它?

我會找到沒有數據庫查找的項目,因爲我已經從數據庫中提取了項目。

如果該項目已經在數據庫中,我必須更新數量。如果它不在數據庫中,它就會被插入。

回答

2

基本上,你想做一個檢查。首先,您將查詢數據庫中是否存在具有SKU值的項目。

如果該值存在於數據庫中,那麼您將執行更新。

如果它不存在於數據庫中,您將執行插入操作。

你可以是一個有點油腔滑調並承擔更新的情況下,像這樣:

update items set ID = ..., qty = ... where SKU = ... 

你會再檢查爲ExecuteNonQuery返回值打電話給你的命令去做。如果它返回1,那麼你知道你影響了一條記錄並且插入成功。如果它返回0,那麼該項目不存在於數據庫中,您需要添加它。

這裏的另一個問題是併發問題。你應該在桌子上有某種時間戳,以檢查其他人是否在客戶端持有該值時對該項目進行了更改。

確保你做的另一件事是把它包裝在一個事務中,以便在執行更新/插入時保證原子操作。

最後,出現的問題是爲什麼你不使用LINQ-to-SQL,LINQ-to-Entities,NHibernate或其他一些ORM-ish類型的解決方案來處理所有這些問題?

+0

我正在使用nhibernate :)只是沒有設置它來做到這一點,看起來很複雜。好的,我只是將我的項目填充到字典中,並檢查重複的方式,謝謝! – mrblah 2009-12-28 22:52:54