2

可能重复:
SQLite - UPSERT不是INSERT 或 REPLACE
如何更新表中的行或如果它不存在则插入它?

我正在使用 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';

我们如何使用 Linq 表达式在 SQLite 3 中实现这一点,现在我正在插入记录并SQLiteException在异常时捕获和更新该记录。请注意下面的代码

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我的表名在哪里。我不确定这是正确的方法,有什么方法可以在单个查询中实现,请帮助我。提前致谢

4

1 回答 1

1

您提出的解决方案具有竞争条件。插入失败后,其他人可能会删除该行,因此更新也会失败。如果您没有并发编写器,这很好(尽管您可能需要在异常处理中更具选择性,以防出现其他问题)。如果你这样做……</p>

使用 SQLiteINSERT语句的冲突子句:

INSERT OR REPLACE INTO …

我怀疑您是否能够直接从 LINQ 访问它,因此您可能必须通过DataContext.ExecuteQuery使用原始 SQL 。

于 2012-08-24T00:04:12.837 回答