【问题标题】:Using SELECT LAST() with pyodbc and MSACCESS sometimes returns same value将 SELECT LAST() 与 pyodbc 和 MSACCESS 一起使用有时会返回相同的值
【发布时间】: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()

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

【问题讨论】:

    标签: python ms-access pyodbc


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 2014-10-20
      • 2018-12-19
      • 2013-07-20
      • 1970-01-01
      • 2020-02-15
      相关资源
      最近更新 更多