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

Posted

技术标签:

【中文标题】将 SELECT LAST() 与 pyodbc 和 MSACCESS 一起使用有时会返回相同的值【英文标题】:Using SELECT LAST() with pyodbc and MSACCESS sometimes returns same value 【发布时间】:2013-10-17 17:13:19 【问题描述】:

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

我使用 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()

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

【问题讨论】:

【参考方案1】:

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

您想要的是在提交 INSERT 后立即执行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()

【讨论】:

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

是的!这似乎是获取最后一个 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

【讨论】:

以上是关于将 SELECT LAST() 与 pyodbc 和 MSACCESS 一起使用有时会返回相同的值的主要内容,如果未能解决你的问题,请参考以下文章

Pyodbc 未检测 SQL 语句中的参数标记(即 - 插入表 SELECT ...)到 Hive 表。这个问题有解决方法吗?

是否可以在SQL中将SELECT函数与LAST函数结合使用?

如果最后一个 impala 语句是 select 语句,如何检查 pyodbc 包?

使用 SELECT ... INTO 使用 pyodbc 创建一个新的 Access 表

pyodbc sql 结果被切断

无法将 pyODBC 与 SQL Server 2008 Express R2 连接