2013-10-17 70 views
2

我有一個奇怪的問題,我無法複製和解決問題。使用SELECT LAST()與pyodbc和MSACCESS有時會返回相同的值

我在Python中使用pyodbc庫來訪問MS Access 2007數據庫。該腳本基本上只是將一個csv文件導入Access以及其他一些技巧。

我想先保存一個'Gift Header' - 然後獲取它所保存的自動編號的id(GiftRef) - 並使用此值保存1個或多個關聯的'Gift Details'。

一切正常,因爲它應該 - 90%的時間。其他10%的時間Access似乎卡住,並重復返回相同的值cur.execute(「從tblGiftHeader」選擇最後(GiftRef)「)。

一旦卡住,它將在腳本持續時間內返回此值。在處理特定條目時或在執行過程中的任何特定時間都不會發生這種情況 - 它看起來完全隨機發生了 。

而且我知道,它返回錯誤的值 - 換句話說,禮品頭被保存 - 而被賦予了新的,獨特的ID - 但無論出於何種原因被調用時不能正確返回值。

SQL = "insert into tblGiftHeader (PersonID, GiftDate, Initials, Total) VALUES "+ str(header_vals) + "" 
cur.execute(SQL) 

gift_ref = [s[0] for s in cur.execute("select last(GiftRef) from tblGiftHeader")][0] 

cur.commit() 

任何想法或見解,將不勝感激。

回答

2

In Access SQL LAST()函數不會必然返回最近創建的AutoNumber值。 (見here瞭解詳細信息。)

你想要的是做一個SELECT @@IDENTITY你提交後立即您的INSERT,像這樣:

import pyodbc 
cnxn = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\\Users\\Public\\Database1.accdb;') 
cursor = cnxn.cursor() 
cursor.execute("INSERT INTO Clients (FirstName, LastName) VALUES (?, ?)", ['Mister', 'Gumby']) 
cursor.commit() 
cursor.execute("SELECT @@IDENTITY AS ID") 
row = cursor.fetchone() 
print row.ID 
cnxn.close() 
+0

謝謝我會嘗試通過一些測試運行此方法。我已經實現了它到我的代碼(一個快速的SQL行更改) - 它似乎工作得很好..但我原來的帖子中的代碼也工作大部分時間。我相信你的想法是正確的,但訪問並不總是相同'最後',我想:) – proc3ss

0

沒錯!這似乎是獲得最後一個ID更可靠的方式。我相信我最初的代碼是基於http://www.w3schools.com/sql/sql_func_last.asp這個例子,我想這是我脫離上下文的結果。

感謝您的協助!這裏是我的原始代碼的更新版本(連接字符串):

MDB = 'C:\\Users\\Public\\database.mdb' 
DRV = '{Microsoft Access Driver (*.mdb)}' 
conn = pyodbc.connect('DRIVER={};DBQ={}'.format(DRV,MDB)) 
curs = conn.cursor() 

SQL = "insert into tblGiftHeader (PersonID, GiftDate, Initials, Total) VALUES "+ str(header_vals) + "" 
curs.execute(SQL) 
curs.commit() 
curs.execute("SELECT @@IDENTITY AS ID") 
row = curs.fetchone() 
gift_ref = row.ID 
相關問題