PyODBC与微软Access:简单查询结果不一致
我正在使用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 个回答
这些字段有被索引吗?如果有的话,可能某个索引坏掉了,你需要对MDB文件进行压缩。如果一个索引坏了,那可能会引发严重的问题。比如,如果坏掉的索引是主键(PK),你可能会失去已有的关系,或者丢失数据。所以在进行这个操作之前,你一定要先备份数据。如果有坏掉的索引,我觉得在使用Access的压缩功能时,它会告诉你,但如果没有提示,你可以查看MSysCompactErrors表,这个表会告诉你在压缩过程中发生了什么错误。
这种情况非常少见,通常可能意味着两种情况:
应用程序设计不当,包括使用过时的Jet版本(Jet 4在服务包6之前非常容易出现这个问题,我就是在那个时候遇到的)。
不可靠的操作环境(网络、硬件或软件问题)。
当然,这个建议可能不太靠谱,但它确实是导致结果不同的一个原因(最常见的情况是对坏掉的索引进行排序,这样你得到的记录数可能和其他排序方式不一样)。
你能给我们一个混淆过的数据库来展示这个问题吗?我从来没有遇到过这个情况。至少给我们一些表的定义——有没有列是浮点数或者小数的?
这个问题是在升级到Access 2007和从源头下载一个新数据库之间解决的。虽然现在还不知道具体是什么原因导致的,但我怀疑可能是某种索引损坏了。