You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用FTS5的已发布VSTO应用中System.Data.SQLite查询执行失败

解决VSTO应用中SQLite FTS5模块发布后无响应的问题

这种开发正常但发布后FTS5功能失效(甚至出现无响应/无限循环)的问题,大多和FTS5模块部署不完整、架构不匹配有关,结合你的64位Office环境,给你几个针对性的解决方案:

1. 放弃Any CPU,锁定目标架构为x64

虽然Any CPU看起来通用,但VSTO和Office的位数绑定很严格——你的客户端是64位Office,直接把项目架构改成x64能避免很多interop库加载的歧义:

  • 右键项目 → 属性 → 生成 → 目标平台选择x64
  • 取消勾选「首选32位」(如果该选项存在)
  • 重新编译并发布,确保输出目录下的x64文件夹中包含SQLite.Interop.dll

2. 确保FTS5模块文件被正确部署

System.Data.SQLite.Core.FTS5 NuGet包提供的FTS5原生模块,很容易在发布时被遗漏:

  • 检查项目中packages\System.Data.SQLite.Core.FTS5.*\build\x64路径下的sqlite3_fts5.dll,将其添加到项目中
  • 设置该文件的「复制到输出目录」为「始终复制」,确保发布时它会被打包到应用运行目录的x64子文件夹中
  • 发布后在客户端机器上确认:应用根目录的x64文件夹里同时存在SQLite.Interop.dll和sqlite3_fts5.dll

3. 显式加载FTS5模块(避免自动加载失效)

有时候自动加载扩展的逻辑会在发布环境中失效,建议在打开连接后手动加载FTS5:

try {
    // 注意在连接字符串中添加启用扩展的配置
    string connectionstring = "Data Source=your_db_path.db;EnableExtensions=True";
    using (SQLiteConnection connection = new SQLiteConnection(connectionstring)) {
        connection.Open();
        // 显式启用扩展并加载FTS5模块
        connection.EnableExtensions(true);
        // 注意模块文件名要和你部署的一致,部分版本可能是sqlite3_fts5.dll
        connection.Execute("SELECT load_extension('sqlite3_fts5.dll')");
        
        using (SQLiteDataAdapter adapter = new SQLiteDataAdapter("SELECT * FROM Categories order by Name", connection)) {
            adapter.Fill(Globals.ThisAddIn.Categories_Table);
        }
    }
} catch (SQLiteException ex) {
    MessageBox.Show($"{ex.Message}\nError code: {ex.ResultCode}\nHResult: {ex.HResult}\nSource: {ex.Source}\nStack trace:\n{ex.StackTrace}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
} catch (Exception ex) {
    MessageBox.Show($"{ex.Message}\nHResult: {ex.HResult}\nSource: {ex.Source}\nStack trace:\n{ex.StackTrace}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

4. 排查隐藏错误(开启SQLite日志)

如果还是无响应,开启SQLite的日志功能,能帮你找到到底卡在了哪一步:

// 在创建连接前添加日志监听
SQLiteConnection.Log += (sender, args) => {
    // 将日志写入文件或临时弹窗,方便客户端排查
    File.AppendAllText("sqlite_log.txt", $"{DateTime.Now}: {args.Message}\n");
};

发布后查看生成的sqlite_log.txt,就能看到模块加载、查询执行的详细过程,定位问题根源。

内容的提问来源于stack exchange,提问作者Mr_Palenoff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:08:15