2

重複の可能性:
SQLite - INSERT または REPLACEではなく
UPSERTテーブル内の行を UPDATE または存在しない場合に INSERT するにはどうすればよいですか?

Windows 8 リリース プレビューと C#(VS 2012) を使用してメトロ アプリを開発しています。

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>

SQLite のINSERTステートメントの conflict 句を使用します。

INSERT OR REPLACE INTO …

LINQ からこれに直接アクセスできるとは思えないため、おそらくDataContext.ExecuteQueryを介して生の SQL を使用する必要があります。

于 2012-08-24T00:04:12.837 に答える