2009-05-06 92 views
3

我使用pyodbc通過Microsoft Jet從Python程序訪問Microsoft Access 2003數據庫中的數據。PyODBC和Microsoft Access:簡單查詢的結果不一致

Microsoft Access數據庫來自第三方;我只是在讀數據。

我通常在提取我需要的數據方面取得了成功,但我最近注意到了一些差異。

我已經熬它歸結爲一個簡單的查詢,形式爲:

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

我混淆的字段名稱和值,但實際上,它並沒有得到多少比這更微不足道!當我在Access中運行查詢時,它會返回一條記錄。

然後我跑過來pyodbc,其代碼如下所示:

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

(同樣,它不會比這更微不足道!)

查詢字符串的值被切斷 - 從Access中的工作查詢中粘貼,但它返回沒有記錄。我預計它會返回相同的記錄。

當我更改查詢以搜索字段2賓果的不同值時,它起作用。這只是它拒絕的一些價值。

所以,請幫助我。我應該在哪裏看下面解釋這種差異?如果我不能相信瑣碎的查詢的結果,我沒有機會參與這個項目!

更新:它變得更簡單!下面的查詢給出不同的號碼......

SELECT COUNT(*)FROM表

我深思,如果它被另一個應用程序,偶爾來填充數據涉及到某種形式的緩存和/或不當事務管理。

+0

如果你有一個遊標對象在那裏執行查詢字符串?然後在遊標上調用Fetchall來產生行。請參閱http://code.google.com/p/pyodbc/wiki/Row – barrowc 2009-05-06 00:56:27

+0

@barrowc,有趣。我沒有注意到缺少cursor()調用。我相信我從某個地方的例子中複製了這個。我嘗試在[rows = connection.cursor()。execute(queryString).fetchall()]中添加它,但它沒有區別 - 顯然pyodbc比Python DB API規範更寬容。 – Oddthinking 2009-05-06 05:21:39

回答

1

升級到Access 2007並從源下載數據庫的新副本之間的問題已得到解決。仍然不知道根本原因是什麼,但懷疑某種形式的索引腐敗。

1

你能給我們一個混淆的數據庫,顯示這個問題?我從來沒有經歷過這個。至少給表定義 - 是浮動列還是小數點列?

+0

我已經投票贊成檢查花車的建議。好的想法,但這不是問題,因爲更新後的版本沒有WHERE子句。 我正在研究如何從Access獲取表格描述。 – Oddthinking 2009-05-06 05:09:00

1

這聽起來很愚蠢。但是...

是實際數據庫的路徑&連接字符串(DSN)指向相同的文件位置嗎?

+0

這是一個完全合理的建議;我真的希望事情變得如此微不足道! 我已經重複檢查,他們都指向相同的目錄。 我見過Access 2003感到困惑,顯然打開了一個最近被刪除的MDB文件,所以我仍然想知道是否有一些緩存或類似的事情發生在這裏。 – Oddthinking 2009-05-06 05:11:44

+0

網絡路徑上的MDB文件是否正嘗試在機器上使用基於python的應用程序? – shahkalpesh 2009-05-06 05:40:43

1

您是否有與其他ODBC工具相同的問題,例如Query Tool? 也可以在ODBC連接管理器中打開ODBC跟蹤。我沒有訪問 ,不知道它的sql命令是否會被跟蹤,但有時它可以幫助我解決ODBC問題。

+0

我剛安裝了查詢工具。我不得不以不同的方式指定數據源(而不是連接字符串)。我跑了「SELECT COUNT(*)FROM table」。它給了我與Python代碼相同的答案,以及對Access中相同語句的不同(較小)答案。所以,好消息,這不是我的Python代碼或pyodbc。壞消息:我不能相信Access/ODBC。 – Oddthinking 2009-05-06 06:03:36

1

字段索引?如果是這樣,可能其中一個索引已損壞,您需要壓縮MDB文件。如果索引已損壞,則可能導致重大問題。你可能會失去現有的關係(如果腐敗指數是PK),或者你可能會丟失數據。所以你需要在做這個之前有一個備份。如果索引損壞,我認爲交互式Access精簡操作會告訴你,但如果沒有,你可以查找MSysCompactErrors表,它將告訴你在壓縮過程中發生了什麼錯誤。

這種情況極少,可以表明以下兩種情況之一:

  1. 糟糕的應用程序設計,包括過時的Jet版本(服務包6之前的Jet 4是這個非常敏感的,這是我遇到的地方它)。

  2. 不可靠的操作環境(網絡/硬件/軟件)。

當然,這個建議是一個真正的長鏡頭,但它是一個不同的結果肯定是一個原因(最常見的是TO ORDER BY的腐敗指數,你會用不同的記錄結束計數比另一個ORDER BY)。

1

我想問題可能是你沒有提交查詢。 PYODBC以autocommit = False開頭,因此每個查詢(如select,insert,update等)都會啓動一個事務,爲了取得效果,您必須提交。請在查詢後致電connection.autocommit = True或致電cursor.execute("commit"),然後提取。