C# SQLite FTS5 表和触发器创建

Posted

技术标签:

【中文标题】C# SQLite FTS5 表和触发器创建【英文标题】:C# SQLite FTS5 Table and Triger creation 【发布时间】:2018-07-30 19:43:43 【问题描述】:

我正在使用 sqlite fts5 创建一个虚拟表,我收到以下错误消息:SQL Logic error no such module: FTS5.下面是我的代码: 在 VS 2017 中使用包管理器我已经下载了 SQLite 和 SQLite FTS5。

    private static void CreateReport()
    
        try
        
            using (SQLiteConnection sqliteConnection = new SQLiteConnection(DataSources.LocalConnectionString()))
            
                sqliteConnection.Open();
                sqliteConnection.EnableExtensions(true);
                string commandText = "CREATE TABLE IF NOT EXISTS JReport(JRId INTEGER PRIMARY KEY, IDId INTEGER, CaseId INTEGER, BoxName TEXT, JRText TEXT, JRFormatted TEXT)";
                string commandText1 = "CREATE VIRTUAL TABLE IF NOT EXISTS DReport USING FTS5(JRId, CaseId, BoxName, CONTENT = 'JReport', CONTENT_ROWID = 'JRId')";
                string commandText2 = "CREATE TRIGGER DocRepo AFTER INSERT ON JReport BEGIN INSERT INTO DReport(RowId, JRId, CaseId, BoxName) VALUES(NEW.JRId, NEW.CaseId, NEW.BoxName) END";
                using (SQLiteCommand sqliteCommand = new SQLiteCommand(commandText, sqliteConnection))
                
                    sqliteCommand.ExecuteNonQuery();
                    sqliteCommand.Dispose();
                
                using (SQLiteCommand sqliteCommand = new SQLiteCommand(commandText1, sqliteConnection))
                
                    sqliteCommand.ExecuteNonQuery();
                    sqliteCommand.Dispose();
                
                using (SQLiteCommand sqliteCommand = new SQLiteCommand(commandText2, sqliteConnection))
                
                    sqliteCommand.ExecuteNonQuery();
                    sqliteCommand.Dispose();
                
                sqliteConnection.Close();
            
        
        catch (Exception ex)
        
            MessageBoxEx.Show("An error has occurred while creating the Report table, the original error is: " +
                ex.Message, "Report", MessageBoxButtons.OK, MessageBoxIcon.Error);
        
    

【问题讨论】:

正在使用 sqlite fts5 感到沮丧。我希望能够在 sqlite 表中搜索文档。嗯。 【参考方案1】:

SQL 逻辑错误没有这样的模块:FTS5。

正如错误消息所说,您的 sqlite3 库没有 FTS5 模块。构建库时,它可能未配置为将其作为内置库包含在内,因为默认情况下未启用它。它可能已被配置和构建您正在使用的库的任何人作为可动态加载的模块提供。或者不。

就个人而言,我总是在我使用的任何程序中包含一个 sqlite3.c 的副本,以避免依赖外部依赖项,因此您可以确保始终使用具有您所有功能的版本想用现在。不知道你必须在 C# 中做什么才能使用你自己的本地实例,但我相信有办法。

Instructions 用于将 FTS5 构建到 sqlite3 中或作为可加载模块。

【讨论】:

肖恩,非常感谢你。我还想问的一件事是,我可以使用 fts4 吗?这也需要上述情况吗?关键是我对这个重新编译sqlite的东西不太熟练,我什至不知道从哪里得到sqlite3.c 取决于您使用的 sqlite3 版本是否支持 FTS3(或者它是否可用作可加载模块)。与 FTS5 或 sqlite 的任何其他可选部分相同的问题。就像我说的,最好在你自己的版本中编译,这样你就知道你需要的功能是受支持的,而不是依赖于系统库版本。您可以从 sqlite 网站获取源代码。

以上是关于C# SQLite FTS5 表和触发器创建的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 正则表和 fts 表

对 SQLite 表和虚拟表的困惑

在 sqlite fts5 查询中使用 Match 但需要更多地控制排名?

SQLite 创建 AFTER UPDATE 触发器

Peewee 可以使用 SQLite 的 FTS5(全文搜索)辅助函数 highlight() 吗?

如何使用带有 Python 3.7 的 sqlite3 python 模块的 FTS5 扩展?