我一直在使用SQLitePCL(目前版本为3.8.7.2),现在决定通过启用外键约束来试验删除和更新级联。我了解默认情况下禁用此功能,根据SQLite documentation,必须为每个数据库连接单独启用约束。
连接字符串仅采用数据库路径(无论如何为SQLitePCL),并且不允许形式为data source=d:\foo\bar\mySqlite.db;foreign keys=ON
的更灵活的复合连接字符串。如果我必须打开每个连接的constaint,如下所示,如何打开约束?
我希望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();
}
我忽略了一些简单的事情,还是这不可能?救命啊!
答案 0 :(得分:0)
PRAGMA语句是一个普通的SQL语句;只是执行它。
要减少键入的数量,您可以编写辅助函数来创建连接并进行配置。
答案 1 :(得分:0)
好的,我明白了:
将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();
}
}