在SQLite + BEGIN TRANSACTION中更快地更新

时间:2014-06-27 05:52:59

标签: c# sql sqlite spatialite

这个也与spatilite有关(不仅仅是SQLite)

我有一个文件数据库xyz.db)我在SQLiteconnection使用了SQLiteconnection for (int y = 0; y < castarraylist.Count; y++) { string s = Convert.ToString(castarraylist[y]); string[] h = s.Split(':'); SQLiteCommand sqlqctSQL4 = new SQLiteCommand("UPDATE temp2 SET GEOM = " + h[0] + "WHERE " + dtsqlquery2.Columns[0] + "=" + h[1] + "", con); sqlqctSQL4.ExecuteNonQuery(); x = x + 1; } 扩展到了spaceite)。

我有很多记录需要更新到数据库中。

castarraylist

高于逻辑Arraylist的是BEGIN TRANSACTION; UPDATE builtuparea_luxbel SET ADMIN_LEVEL = 6 where PK_UID = 2; UPDATE builtuparea_luxbel SET ADMIN_LEVEL = 6 where PK_UID = 3; COMMIT TRANSACTION; ,其中包含需要处理到数据库中的值。

当我检查上面的代码时,在1分钟内更新了大约400条记录。

有什么方法可以提高性能吗?

注::(文件数据库不是线程安全的)

2。开始交易

假设我想在Spatialite中使用单个事务运行两个(或数百万个)更新语句..是否可能?

我在线阅读并为我准备以下声明(但未获得成功)

{{1}}

以上语句不更新数据库中的记录。 SQLite不支持BEGIN TRANSACTION吗? 有什么我想念的吗?

如果我需要运行个人陈述,那么如上所述需要花费太多时间进行更新......

2 个答案:

答案 0 :(得分:17)

SQLite支持Transaction,您可以尝试下面的代码。

using (var cmd = new SQLiteCommand(conn))
using (var transaction = conn.BeginTransaction())
{
    for (int y = 0; y < castarraylist.Count; y++)
    {
        //Add your query here.
        cmd.CommandText = "INSERT INTO TABLE (Field1,Field2) VALUES ('A', 'B');";
        cmd.ExecuteNonQuery();
    }
    transaction.Commit();
}

答案 1 :(得分:5)

  • 数据库事务的主要目标是完成所有事情,如果内部出现故障,则无需;

  • 通过更改其CommandText属性重新使用相同的 SQLiteCommand对象并再次执行它可能会更快,但会导致内存开销:如果您有要执行的大量查询,最好是在使用后处置对象并创建一个新对象;

ADO.NET事务的常见模式是:

using (var tra = cn.BeginTransaction())
{
    try
    { 
        foreach(var myQuery in myQueries)
        { 
            using (var cd = new SQLiteCommand(myQuery, cn, tra))
            {
                cd.ExecuteNonQuery();
            }
        }

        tra.Commit();
    }
    catch(Exception ex)
    {
        tra.Rollback();
        Console.Error.Writeline("I did nothing, because something wrong happened: {0}", ex);
        throw;
    }
}