是否有一种方法可以从Mono.Data.Sqlite中的连接字符串启用“ PRAGMA foreign_keys = true”?

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

我正在使用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文档知道,外键已被...

c# sqlite unity3d mono
1个回答
0
投票

是否可能像System.Data.Sqlite一样,但在Mono.Data.Sqlite中呢?


0
投票

目前,由于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为止。

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