我正在使用Mono.Data.Sqlite和Mono.Data.SqliteClient作为Unity的插件来管理与Unity 3D内部的SQLite数据库的连接。
我知道,SQLite documentation默认情况下禁用外键,并且需要在每个连接上启用它。
对于使用System.Data.SQLite的用户,读取this answer似乎可以在连接字符串处启用前键。但这在Mono.Data.Sqlite上不起作用。
new SqliteConnection($"Data Source = {this.databasePath}; PRAGMA foreign_keys = true;"); //not working
但是,如果我输入命令“ PRAGMA foreign_keys = true;”在我的插入/更新/删除之前,它可以按预期工作,并且启用了FK。
using (var command = connection.CreateCommand())
{
command.CommandText = "PRAGMA foreign_keys = true; INSERT INTO Character ... "; //works!
}
但是我想在我的字符串连接中启用FK,以防止某些程序员忘记在某些SQL代码中运行PRAGMA命令。
是否可能像System.Data.Sqlite一样,但在Mono.Data.Sqlite中呢?
=========================================> => [编辑]替代方法: 目前,由于Mono.Data.Sqlite中的SqliteConnection和SqliteCommand是密封类,因此我制作了一个带有'trick'的扩展方法,以在sql命令之前强制执行PRAGMA,并添加了一个新的方法来由SqliteCommand调用:
using Mono.Data.Sqlite; public static class CustomSqliteCommand { public static int ExecuteNonQueryWithFK(this SqliteCommand cmd) { var tmp = cmd.CommandText; cmd.CommandText = $"PRAGMA foreign_keys = true; {tmp}"; return cmd.ExecuteNonQuery(); } }
其用法如下:
protected void InsertData() { var commandText = "INSERT INTO MyTable VALUES (@param1, @param2);"; using (var connection = Connection) { connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = commandText; command.Parameters.AddWithValue("@param1", someVar1); command.Parameters.AddWithValue("@param2", someVar2); var result = command.ExecuteNonQueryWithFK(); } } }
经过测试并作为变通办法,直到有一天将flite作为默认值重新编译sqlite库或sqlite为止。
我正在使用Mono.Data.Sqlite和Mono.Data.SqliteClient作为Unity的插件来管理与Unity 3D内部的SQLite数据库的连接。我通过SQLite文档知道,外键已被...
是否可能像System.Data.Sqlite一样,但在Mono.Data.Sqlite中呢?
目前,由于Mono.Data.Sqlite中的SqliteConnection和SqliteCommand是密封类,因此我制作了一个带有'trick'的扩展方法,以在sql命令之前强制执行PRAGMA,并添加了一个新的方法来由SqliteCommand调用:
using Mono.Data.Sqlite;
public static class CustomSqliteCommand
{
public static int ExecuteNonQueryWithFK(this SqliteCommand cmd)
{
var tmp = cmd.CommandText;
cmd.CommandText = $"PRAGMA foreign_keys = true; {tmp}";
return cmd.ExecuteNonQuery();
}
}
其用法如下:
protected void InsertData()
{
var commandText = "INSERT INTO MyTable VALUES (@param1, @param2);";
using (var connection = Connection)
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = commandText;
command.Parameters.AddWithValue("@param1", someVar1);
command.Parameters.AddWithValue("@param2", someVar2);
var result = command.ExecuteNonQueryWithFK();
}
}
}
经过测试并作为变通办法,直到有一天将flite作为默认值重新编译sqlite库或sqlite为止。