数据库磁盘映像损坏 sqlite

3
我已将我的.NET 2.0项目迁移到.NET 4.0。因此,我不得不将system.data.sqlite库升级到可用的最新版本1.0.81。
现在,当我尝试使用“select * from table”查询大表时,会出现“数据库磁盘映像损坏”的错误。这仅发生在记录很多的表上,小表返回记录。
请注意,如果我回到.NET 2.0和system.data.sqlite 1.0.66,同一个DB文件就可以正常工作。
有任何想法吗?

我刚刚下载并开始使用1.0.82版本。这个新版本在VS2010上调试打印错误信息(不错)。所以错误实际上是SQLite错误(11):[c0d89d4a97]的第49537行处发生了数据库损坏。所以我猜测数据库已经损坏了。为什么1.0.66可以读取数据库,而更新版本不能呢?真奇怪!!! - rpcm
3个回答

7
最近我也遇到了类似的问题。即使使用以下查询将ATable表中所有AColumn值更新为新值,例如2

UPDATE ATable SET AColumn = 2;

以下是“select distinct”查询的示例:
SELECT DISTINCT AColumn from ATable;

返回旧值,例如1、2、3等

SELECT * FROM ATable WHERE AColumn = 1

出现了"The database disk image is malformed sqlite"的错误。

一个名为ATable的表在AColumn上建立了索引,所有通过该索引进行的查询都返回了错误的结果。使用以下PRAGMA运行完整性检查后发现一些索引已经损坏。

PRAGMA integrity_check;

IDX_AColumn缺少很多行,索引中也包含错误数量的条目。幸运的是,在所有表中的数据都完好无损,只有一些索引是损坏的。重新创建这些损坏的索引可以解决问题。

REINDEX ATable; http://www.sqlite.org/lang_reindex.html

如果许多索引受损,可以使用以下命令同时重新索引所有索引:

REINDEX;

2

你的数据库文件已经损坏,旧版本的SQLite无法检测到这一点。

使用备份数据创建一个新的数据库文件(或尽可能多地从旧数据库中提取数据)。


2

我进行了一些测试,发现实际上只需要一个小操作就可以解决它。

  1. 使用任何软件打开数据库
  2. 删除数据库密码
  3. 保存数据库
  4. 重新打开数据库
  5. 再次设置密码

相当愚蠢。

希望这能帮助任何遇到同样问题的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接