7

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

我有一个文件数据库xyz.db),我正在使用它SQLiteconnectionSQLiteconnection扩展至空间站)。

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

                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;
                }

上面的逻辑castarraylistArraylist包含需要处理到数据库中的值。

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

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

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

2. 开始交易

假设我喜欢在 Spatialite 中使用单个事务运行两个(或数百万个)更新语句。这可能吗?

我在网上阅读并为我准备了以下声明(但没有成功)

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; 

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

如果我需要运行单独的语句,那么如上所述更新需要花费太多时间......

4

2 回答 2

24

SQLite 支持事务,你可以试试下面的代码。

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();
}
于 2014-06-27T06:00:33.433 回答
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;
    }
}
于 2014-07-09T16:02:48.303 回答