2012-08-22 47 views
1

可能重複:
SQLite - UPSERT not INSERT or REPLACE
How do I UPDATE a row in a table or INSERT it if it doesn't exist?的Upsert SQLite中3使用LINQ表達

我正在開發使用的是Windows 8發佈預覽和C#(VS 2012)metro應用,我新來的SQLite,我整合SQLite 3.7.13在我的應用程序,它工作正常,在MYSQL我們有像

INSERT INTO tablename (id, name) 
VALUES (21, 'foo') 
ON DUPLICATE KEY UPDATE name = 'boo'; 

,我們怎樣才能SQLite的3使用LINQ表達,現在我在插入記錄和捕捉SQLiteException和更新exception.Please該記錄遵守以下

var dbPath = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path,"Student.db"); 
DateTime LastUpdated = DateTime.UtcNow; 
using (var db = new SQLite.SQLiteConnection(dbPath)) 
{ 
    try 
    { 
     db.Insert(new studentRecord() { sid = 21, name = 'foo', last_updated = LastUpdated });     
    } 
    catch(SQLite.SQLiteException ex) 
    { 
     db.Update(new studentRecord() { sid = 21, name = 'boo', last_updated = LastUpdated }); 
    } 
} 

我的代碼在哪裏studentRecord是我的表名實現這一目標。 我不確定這是正確的方式,有沒有什麼辦法可以在單個查詢中實現,請幫助我。在此先感謝

+0

如果拋出另一個異常會怎麼樣?就像「連接丟失」一樣,當你嘗試在catch中更新時它會拋出另一個錯誤,並且會因爲你不嘗試捕獲該錯誤而崩潰。也許有更好的辦法像你的mysql,但我寧願檢查項目是否已經存在,並根據該查詢更新或插入。 – Silvermind

回答

0

您提出的解決方案有競爭條件。插入失敗後,其他人可能會刪除該行,這樣更新也會失敗。如果你沒有併發編寫器,這沒什麼問題(儘管你可能需要在異常處理中選擇更多的選擇,以防出現其他問題)。如果你這樣做......

使用SQLite的INSERT聲明的衝突條款:

INSERT OR REPLACE INTO … 

我懷疑你將能夠直接從LINQ訪問它,所以你可能必須通過DataContext.ExecuteQuery使用原始SQL 。