执行LiteDB删除代码后LiteDB Viewer提示文件无效或不支持
问题场景
我持有一个data.db LiteDB数据库文件,需要删除库中部分数据,编写了如下代码执行删除操作:
using (var db = new LiteDatabase("Filename=data.db;upgrade=true")) { var collection = db.GetCollection<Capture>("capture"); // 展示删除前的记录总数 MessageBox.Show("COUNT : " + collection.Count().ToString()); var col = db.GetCollection<Capture>("capture"); var data_list = col.Find(Query.All(), 0, 3); foreach (var row in data_list) { // 展示待删除行的ID MessageBox.Show(row.Id.ToString()); col.Delete(row.Id); } // 展示删除后的记录总数 MessageBox.Show("COUNT : " + collection.Count().ToString()); this.Close(); }
实际运行时的现象如下:
- 代码可正常执行完成,无运行时异常抛出
- 执行代码前,用LiteDB Viewer打开该数据库无任何报错
- 代码执行结束后,再用LiteDB Viewer打开文件验证删除结果时,工具弹出错误:Selected file is invalid or not supported(所选文件无效或不受支持)
根因分析
问题核心出在连接字符串里的upgrade=true配置:
这个参数的作用是打开数据库时,自动将旧版本格式的LiteDB文件原地升级为当前项目引用的LiteDB SDK对应的文件格式,升级过程不会保留旧格式的文件副本。而LiteDB跨大版本的文件格式互不兼容,你当前使用的LiteDB Viewer版本低于项目里的LiteDB SDK版本,无法识别升级后的新格式文件,就会报文件无效的错误。
另外代码里重复调用了两次GetCollection<Capture>("capture")获取同一个集合,属于冗余写法,不会引发功能问题,但可以优化。
解决方案
- 先确认项目中安装的LiteDB NuGet包版本,下载和该版本号完全匹配的LiteDB Viewer,即可正常打开数据库文件,验证数据删除结果。
- 如果你需要继续使用当前旧版本的LiteDB Viewer,直接把连接字符串里的
upgrade=true参数删除即可。只要你的增删改查操作没有用到高版本SDK的专属特性,数据库文件会保持原有版本格式,不会触发自动升级,旧版工具可以正常识别。 - 后续对数据库文件做写操作前,建议先对原文件做备份,避免版本升级、误操作导致数据无法被原有工具读取。
内容的提问来源于stack exchange,提问作者BazSaraa
相关产品推荐
相关产品推荐

