3

我通过 Microsoft Jet 使用 pyodbc 从 Python 程序访问 Microsoft Access 2003 数据库中的数据。

Microsoft 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 的不同值时,宾果游戏可以正常工作。它拒绝的只是一些价值观。

所以,请帮帮我。我接下来应该在哪里寻找来解释这种差异?如果我不能相信琐碎查询的结果,我就没有机会参与这个项目!

更新:它变得更加简单!以下查询给出了不同的数字...

从表中选择计数(*)

我考虑它是否与某些形式的缓存和/或另一个偶尔填充数据的应用程序的不正确事务管理有关。

4

6 回答 6

1

你能给我们一个显示这个问题的混淆数据库吗?我从来没有经历过这种情况。至少给出表定义——任何列是浮点数还是小数?

于 2009-05-06T01:48:38.093 回答
1

这听起来可能很愚蠢。但...

实际数据库和连接字符串 (DSN) 的路径是否指向相同的文件位置?

于 2009-05-06T04:34:44.480 回答
1

您是否对其他 ODBC 工具(例如Query Tool )有同样的问题?您还可以在 ODBC 连接管理器中打开 ODBC 跟踪。我没有访问权限,也不知道它的 sql 命令是否会被跟踪,但有时它可以帮助我解决 ODBC 问题。

于 2009-05-06T05:21:57.410 回答
1

字段是否被索引?如果是这样,可能其中一个索引已损坏,您需要压缩 MDB 文件。如果索引损坏,可能会导致重大问题。您可能会丢失现有的关系(如果损坏的索引是 PK),或者您可能会丢失数据。因此,您需要在执行此操作之前进行备份。如果有损坏的索引,我认为交互式 Access 压缩操作会告诉你,但如果没有,你可以查找 MSysCompactErrors 表,它会告诉你压缩期间发生了哪些错误。

这种情况很少发生,并且可以表明以下两种情况之一:

  1. 糟糕的应用程序设计,包括过时的 Jet 版本(Service Pack 6 之前的 Jet 4 非常容易受到这种影响,这就是我遇到的地方)。

  2. 不可靠的操作环境(网络/硬件/软件)。

当然,这个建议是一个真正的远景,但它绝对是导致不同结果的一个原因(最常见的是对损坏的索引进行 ORDER BY,你最终会得到与另一个 ORDER BY 不同的记录数) .

于 2009-05-06T21:25:56.640 回答
1

在升级到 Access 2007 和从源下载数据库的新副本之间的某个地方解决了问题。仍然不知道根本原因是什么,但怀疑某种形式的索引损坏。

于 2009-05-27T00:25:56.630 回答
1

我想问题可能是您没有提交查询。PYODBC 以 autocommit = False 开头,因此每个查询(如 select、insert、update 等)都会启动一个事务,为了生效,您必须提交。在查询之后调用connection.autocommit = True或调用cursor.execute("commit")然后fetchall。

于 2009-12-23T17:42:01.270 回答