Python 将SELECT LAST()与pyodbc和MSACCESS一起使用有时会返回相同的值

Python 将SELECT LAST()与pyodbc和MSACCESS一起使用有时会返回相同的值,python,ms-access,pyodbc,Python,Ms Access,Pyodbc,我有一个奇怪的问题,我复制和解决都有困难 我正在使用Python中的pyodbc库访问MS access 2007数据库。该脚本基本上只是将一个csv文件导入Access以及一些其他技巧 我试图先保存一个“礼物头”-然后获取保存它的自动输入id(GiftRef)-并使用此值保存一个或多个关联的“礼物详细信息” 每样东西都能正常工作——90%的时间都是如此。另外10%的时间访问似乎被卡住,并重复返回cur.execute的相同值(“从tblGiftHeader中选择最后一个(GiftRef)) 一

我有一个奇怪的问题,我复制和解决都有困难

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

我试图先保存一个“礼物头”-然后获取保存它的自动输入id(GiftRef)-并使用此值保存一个或多个关联的“礼物详细信息”

每样东西都能正常工作——90%的时间都是如此。另外10%的时间访问似乎被卡住,并重复返回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()

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

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

您要做的是在提交插入后立即执行
SELECT@@IDENTITY
,如下所示:

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()

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

您要做的是在提交插入后立即执行
SELECT@@IDENTITY
,如下所示:

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()

是的!这似乎是一种更可靠的获取最后一个id的方法。我相信我的初始代码是基于这里的示例的,我想我是断章取义的

谢谢你的帮助!以下是我的原始代码的更新版本(带有连接字符串):


是的!这似乎是一种更可靠的获取最后一个id的方法。我相信我的初始代码是基于这里的示例的,我想我是断章取义的

谢谢你的帮助!以下是我的原始代码的更新版本(带有连接字符串):


谢谢,我将尝试通过一些测试运行此方法。我已经在我的代码中实现了它(一个快速的sql行更改)-它似乎工作得很好。。但我最初帖子中的代码在大部分时间也有效。不过,我相信您的想法是正确的,Access并不总是得到我想要的“最后一个”:)谢谢,我将尝试通过一些测试运行此方法。我已经在我的代码中实现了它(一个快速的sql行更改)-它似乎工作得很好。。但我最初帖子中的代码在大部分时间也有效。不过,我相信您的想法是正确的,Access并不总是得到我想要的“最后一个”: