我正在使用支持的SQLite数据库在Windows Forms .Net Compact Framework 3.5中创建应用程序。由于性能原因,我需要保持与数据库的开放连接,并且我需要使用事务来执行多个更新,以便进行回滚。
在某些SQLite表中有外键约束,默认情况下,外键强制处于关闭状态,因此在打开从应用程序到数据库的连接时,我不得不手动将其打开。
现在的问题是,交易不允许外键约束:(https://sqlite.org/pragma.html#pragma_foreign_keys)
因此,当我运行update语句时,它们将失败,并且事务将回滚。
我尝试在事务之前手动关闭外键约束,然后更新成功。但是,当我尝试在事务处理之后重新打开外键约束时,更新失败。
我需要启用外键约束,但是它们在事务期间会失败,因此我无法简单地将其关闭,运行事务然后再将其重新打开。那我该怎么办?
using (var cmd1 = new SQLiteCommand(Con))
{
cmd1.CommandText = "PRAGMA foreign_keys = 0"; //turn foreign key contraint off before transaction
cmd1.ExecuteNonQuery();
}
var cmd2 = new SQLiteCommand(Con);
using (SQLiteTransaction transaction = Con.BeginTransaction())
{
//run update commands here
transaction.Commit(); //run transaction
}
using (var cmd3 = new SQLiteCommand(Con))
{
cmd3.CommandText = "PRAGMA foreign_keys = 1"; //turn foreign key constraint back on after transaction
cmd3.ExecuteNonQuery(); //this doesnt work
}
我正在使用支持的SQLite数据库在Windows Forms .Net Compact Framework 3.5中创建应用程序。出于性能原因,我需要保持与数据库的开放连接,我是...
您可以在交易期间启用外键。您只是无法在交易过程中打开或关闭它们-您必须在开始交易之前将它们打开。