Har*_*dik 7 c# sql sqlite spatialite
这个也与spatilite有关(不仅仅是SQLite)
我有一个文件数据库(xyz.db)我正在使用SQLiteconnection(SQLiteconnection扩展到spatialite).
我有这么多记录需要更新到数据库中.
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;
}
Run Code Online (Sandbox Code Playgroud)
在上面的逻辑castarraylist是Arraylist其中包含的值需要加工成数据库.
当我检查上面的代码时,在1分钟内更新大约400条记录.
有什么方法可以提高性能吗?
NOTE ::(文件数据库不是线程安全的)
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;
Run Code Online (Sandbox Code Playgroud)
以上语句不更新我的数据库中的记录.SQLite不支持BEGIN TRANSACTION吗?有什么我错过的吗?
如果我需要运行个人陈述,那么如上所述,它需要花费太多时间进行更新......
Sur*_*esh 18
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();
}
Run Code Online (Sandbox Code Playgroud)
数据库事务的主要目标是完成所有事情,如果内部出现故障则没有任何内容;
通过更改其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;
}
}
Run Code Online (Sandbox Code Playgroud)