【问题标题】:How to set the 'PRAGMA foreign_keys = ON' statement with SQLitePCL如何使用 SQLitePCL 设置“PRAGMA foreign_keys = ON”语句
【发布时间】:2016-10-14 08:33:24
【问题描述】:

我一直在使用SQLitePCL(当前版本为 3.8.7.2),现在决定通过打开外键约束来尝试删除和更新级联。我了解默认情况下禁用此功能,根据SQLite documentation,必须为每个数据库连接单独启用约束。

连接字符串仅采用数据库路径(无论如何对于 SQLitePCL)并且不允许更灵活的 data source=d:\foo\bar\mySqlite.db;foreign keys=ON 形式的复合连接字符串。如果我必须为每个连接开启约束,如下图,如何开启约束?

我期待ISQLiteStatement API 提供一些将PRAGMA foreign_keys = ON 语句注入我的连接语句 的方法,但没有看到明显的 [Intellisense] 方法或属性来实现这一点。探索 SQLiteConnection API 甚至不是一个开始,因为打开外键约束是每个连接。

注意:下面的 DeleteItemByIdQuery() 和 BindIdToDeleteItemByIdQuery() 方法返回 SQL 查询字符串,为简洁起见省略了详细信息。

using (ISQLiteStatement statement = new SQLiteConnection("d:\foo\bar\mySqlite.db").Prepare(DeleteItemByIdQuery()))
{
    BindIdToDeleteItemByIdQuery(statement, id);
    SQLiteResult result = statement.Step();
}

我忽略了一些简单的事情,还是这不可能?救命!

【问题讨论】:

    标签: c# sqlite windows-runtime uwp


    【解决方案1】:

    PRAGMA 语句是普通的 SQL 语句;执行即可。

    为了减少输入量,您可以编写一个帮助函数来创建和配置连接。

    【讨论】:

    • 我知道PRAGMA是一个普通的SQL;问题是如何在单个连接中执行。我在using (var conn = new SQLiteConnection 块中按顺序尝试了 PRAGMA 和 main 语句,但没有奏效。这让我假设 PRAGMA 可能必须是单个 ISQLiteStatement statement 的一部分,但是......看起来最基本的东西应该是显而易见的,但令人惊讶的是,尽管我使用 SQLitePCL 却无法弄清楚它的大部分功能(并决定继续使用 FK 约束进行关系完整性维护,但被卡住了!)。
    【解决方案2】:

    好的,我想通了:

    将SQLiteConnection 保留为外部using 块并执行一系列PRAGMA 和其中的主语句。有趣的是,我以为我以前也尝试过,但没有得到现在的结果——当时可能还有其他错误。

    using (var conn = new SQLiteConnection(@"d:\foo\bar\mySqlite.db"))
    {
        // First turn ON the FK constraint
    
        using (var statement = conn.Prepare(@"PRAGMA foreign_keys = ON"))
        {
            SQLiteResult result = statement.Step();
        }
    
        // Then Delete item that will Cascade deletion in referencing table(s)
    
        using (var statement = conn.Prepare(SqlDeleteItemById()))
        {
            SqlBindIdToDeleteItemById(statement, id);
            SQLiteResult result = statement.Step();
        }
    }
    

    【讨论】:

    • 请注意,每次查询都重新打开数据库是非常低效的。
    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 2012-11-22
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多