2

我有一个奇怪的问题,我无法复制和解决。

我在 Python 中使用 pyodbc 库来访问 MS Access 2007 数据库。该脚本基本上只是将 csv 文件导入 Access 以及其他一些技巧。

我正在尝试首先保存一个“礼物标题”-然后获取保存它的自动递增 id (GiftRef)-并使用此值保存 1 个或多个关联的“礼物详细信息”。

90% 的时间里,一切都按原样工作。另外 10% 的时间 Access 似乎卡住并反复为 cur.execute("select last(GiftRef) from tblGiftHeader") 返回相同的值。

一旦它被卡住,它就会在脚本的持续时间内返回这个值。它不会在处理特定条目或执行中的任何特定时间发生 - 它似乎完全随机发生。

我也知道它返回了错误的值——换句话说,礼品标头保存了——并且被赋予了新的、唯一的 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()

任何想法或见解将不胜感激。

4

2 回答 2

4

在 Access SQL 中,该LAST()函数不一定返回最近创建的自动编号值。(有关详细信息,请参见此处。)

您想要的是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()
于 2013-10-17T17:45:11.350 回答
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
于 2013-10-17T19:19:31.773 回答