在c#紧凑框架中,如何在保持开放连接中外键约束的同时执行SQLite事务?]

问题描述 投票:0回答:1

我正在使用支持的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中创建应用程序。出于性能原因,我需要保持与数据库的开放连接,我是...

c# sqlite transactions compact-framework
1个回答
0
投票

您可以在交易期间启用外键。您只是无法在交易过程中打开或关闭它们-您必须在开始交易之前将它们打开。

© www.soinside.com 2019 - 2024. All rights reserved.