PyODBC与微软Access:简单查询结果不一致

3 投票
6 回答
9039 浏览
提问于 2025-04-15 11:25

我正在使用pyodbc,通过Microsoft Jet,从Python程序访问一个Microsoft Access 2003数据库里的数据。

这个Access数据库是第三方提供的,我只是用来读取数据。

我通常能顺利提取到需要的数据,但最近发现了一些不一致的地方。

我把问题简化成一个简单的查询,格式如下:

SELECT field1 FROM table WHERE field1 = 601 AND field2 = 9067

我把字段名和数值都做了处理,但其实这查询非常简单!在Access中运行这个查询时,它返回了一条记录。

然后我在pyodbc中运行它,代码看起来像这样:

connection = pyodbc.connect(connectionString)
rows = connection.execute(queryString).fetchall()

(再次强调,这个查询真的很简单!)

queryString的值是从Access中有效的查询直接复制过来的,但它却返回了没有记录。我本以为它会返回同样的记录。

当我把查询改成查找field2的另一个值时,结果就对了,能正常工作。只有某些值被拒绝了。

所以,请帮帮我。我接下来应该关注哪里来解释这个不一致的情况?如果连简单的查询结果都不可靠,那我在这个项目上就没希望了!

更新:事情变得更简单了!下面这个查询返回的数字不一样……

SELECT COUNT(*) FROM table

我在想这是否和某种缓存机制有关,或者是另一个偶尔会填充数据的应用程序管理事务不当。

6 个回答

1

这些字段有被索引吗?如果有的话,可能某个索引坏掉了,你需要对MDB文件进行压缩。如果一个索引坏了,那可能会引发严重的问题。比如,如果坏掉的索引是主键(PK),你可能会失去已有的关系,或者丢失数据。所以在进行这个操作之前,你一定要先备份数据。如果有坏掉的索引,我觉得在使用Access的压缩功能时,它会告诉你,但如果没有提示,你可以查看MSysCompactErrors表,这个表会告诉你在压缩过程中发生了什么错误。

这种情况非常少见,通常可能意味着两种情况:

  1. 应用程序设计不当,包括使用过时的Jet版本(Jet 4在服务包6之前非常容易出现这个问题,我就是在那个时候遇到的)。

  2. 不可靠的操作环境(网络、硬件或软件问题)。

当然,这个建议可能不太靠谱,但它确实是导致结果不同的一个原因(最常见的情况是对坏掉的索引进行排序,这样你得到的记录数可能和其他排序方式不一样)。

1

你能给我们一个混淆过的数据库来展示这个问题吗?我从来没有遇到过这个情况。至少给我们一些表的定义——有没有列是浮点数或者小数的?

1

这个问题是在升级到Access 2007和从源头下载一个新数据库之间解决的。虽然现在还不知道具体是什么原因导致的,但我怀疑可能是某种索引损坏了。

撰写回答