Linux环境Mono运行C#程序时Mono.Data.SqliteClient无法打开gmdb数据库问题
问题修复方案
核心原因
- Mono默认自带的
Mono.Data.SqliteClient库版本老旧,内置低版本SQLite引擎,不会调用你系统安装的新版sqlite3,解析逻辑与当前主流SQLite版本不兼容 - 旧版Mono.SqliteClient默认对非
.db后缀的数据库文件优先走加密校验逻辑,会误将正常的gmdb数据库判定为加密/非法文件 - 你当前使用的URI格式连接字符串不符合Mono下的SQLite解析规则,路径识别异常也会导致文件读取失败
修复步骤
1. 替换Sqlite依赖包
直接弃用系统自带的Mono.Data.SqliteClient,改用跨平台兼容的System.Data.SQLite.Core或者Microsoft.Data.SqliteNuget包,这两个包都会自动适配对应系统的原生sqlite3库,和你本地安装的sqlite3、SQLite浏览器调用的引擎版本一致,不会出现识别差异。
2. 修正连接字符串格式
Mono环境下的SQLite连接字符串无需使用URI前缀,直接指定Data Source参数即可,参考格式:
Data Source=/完整路径/Data.gmdb;Version=3;
如果需要跨平台兼容,可在代码中通过Path.Combine()动态生成对应系统的文件路径后传入连接字符串。
3. 兜底兼容配置
如果修改后仍然报错,可先通过系统sqlite3命令查询数据库的页大小:sqlite3 Data.gmdb "PRAGMA page_size;"
将查询到的页大小参数加到连接字符串中即可:
Data Source=/完整路径/Data.gmdb;Version=3;Page Size=查询到的数值;
内容的提问来源于stack exchange,提问作者zimopisec
相关产品推荐
相关产品推荐

