SQLiteAsyncConnection按顺序插入多行?

时间:2017-11-05 01:21:57

标签: c# sqlite sqlite.net

之前我使用过SQLite,在for循环中使用Insert添加多行很慢。解决方案是使用transaction

既然我在SQLite.Net中使用SQLiteAsyncConnection(对于ORM),我也尝试使用transaction。它有效,但只有一个问题。插入顺序不是数据的顺序。

Database.RunInTransactionAsync(
    (SQLiteConnection conn) => {
        foreach (var row in rows)
        {
            conn.InsertOrReplace(row);
        }
        conn.Commit();
    }
);

如果rows包含[1,2,3,4,5,6],则数据库中的行类似于[3,1,2,6,4,5]。我怎样才能保留原始订单?

请注意,我只是指新插入的行。甚至认为代码正在替换现有行,在测试时,数据库中没有要替换的行。

PS :该行有ID字段,即[PrimaryKey],但在rows中,行未按ID排序。似乎在数据库中行按ID排序。我不希望它按ID排序,而是要维护原始订单。

PS 2 :我需要知道最后插入行的ID。使用DB Browser for SQLite之类的GUI工具查看数据库或通过LIMIT 1获取最后一项时,似乎SQLite已自动按ID对行进行排序。我做了一些Google搜索,并且根据SQL的规则说,当没有ORDER BY时,返回行的顺序无论如何都不能保证是物理顺序。我应该创建另一个字段并将其设置为主要的自动增加字段吗?

目前,ID每行保证唯一,但ID'是数据本身的一部分,而不是专门为数据库使用而添加的字段。

1 个答案:

答案 0 :(得分:0)

SQL表在逻辑上是无序的,因此如果您需要某个订单,则始终必须在查询中使用ORDER BY。

如果您的数据不包含与插入顺序对应的任何值(例如,时间戳),则必须使用rowid,即添加声明为INTEGER PRIMARY KEY的列。