这个也与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吗? 有什么我想念的吗?
如果我需要运行个人陈述,那么如上所述需要花费太多时间进行更新......
答案 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;
}
}