使用 Pyodbc 在 MS Access 表中写入新行的问题

Posted

技术标签:

【中文标题】使用 Pyodbc 在 MS Access 表中写入新行的问题【英文标题】:Issue with writing new rows in a MS Access table using Pyodbc 【发布时间】:2021-11-05 05:17:33 【问题描述】:

最近我一直在尝试编写一个允许从 MS Access 数据库读取和写入信息的代码。为此,我在 Visual Studio 中使用 python 3.7 和 PIP Pyodbc。我已成功连接到数据库,并且我的 read() 函数工作正常。我的 write() 函数出现了这个问题,因为它抛出了一个错误,我不知道为什么。 write() 函数设置为从定义的类中获取变量并将这些变量写入数据库。当我运行代码时,我收到此错误。

('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句中的语法错误。(-3502) (SQLExecDirectW)')

下面附上我的代码副本和数据库图像。 MS Access Image

import pyodbc #Opens MS Access database
conn = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=C:\Users\peyto\Desktop\Test Database.accdb;')
cursor = conn.cursor()
cursor.execute('select * from ToDo')

class GlobalVars(): #Variables to be taken from website
    Group = ""
    TaskName = ""
    TaskDesc = ""
    DueDate = "00000001"
    DueTime = "000001"
    PM = False #Will allow PM/AM to append to date in Write()
    Append = False #If false will not attempt to update record
    RowToAppend = ""
    Delete = False
    Write = False

def Read(): #Prints all values in the table
    for row in cursor.fetchall():
        print (row)

def Update(): #Update database row
    #Code not yet tested not relevant to current issue.
    cursor.execute('UPDATE ToDo'
               'SET GlobalVars.Group, GlobalVars.TaskName, GlobalVars.TaskDesc, GlobalVars.DueDate, GlobalVars.DueTime'
               'WHERE condition')
    cursor.commit()

def Delete(): #Will delete any given row of database
    print("Code not yet ready")

def Write():
    if GlobalVars.PM == False:
        GlobalVars.DueTime = GlobalVars.DueTime + " AM" #Concatenate AM on end of string
    else:
        GlobalVars.DueTime = GlobalVars.DueTime + " PM" #Concatenate PM on end of string
    sql = "INSERT INTO ToDo (Group, TaskName, TaskDesc, DueDate, DueTime) VALUES (?, ?, ?, ?, ?)"
    val = (GlobalVars.Group, GlobalVars.TaskName, GlobalVars.TaskDesc, GlobalVars.DueDate, GlobalVars.DueTime)
    cursor.execute(sql, val)

    cursor.commit()


if GlobalVars.Append == True: #Checks which function to run based on website input
    Update()
elif GlobalVars.Delete == True:
    Delete()
elif GlobalVars.Write == True:
    Write()
Write()
Read()

【问题讨论】:

group 是关键字(例如GROUP BY),应该用括号括起来 【参考方案1】:

字段DueDateDueTime 似乎是文本数据类型,因为它们是左对齐的。

将这些字段更改为 DateTime 并确保在插入时传递有效的日期和时间值 - 这意味着 GlobalVars.DueDateGlobalVars.DueTime 必须包含真实的日期/时间值。

【讨论】:

以上是关于使用 Pyodbc 在 MS Access 表中写入新行的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pyodbc 执行保存在 MS Access 中的查询

如何使用 pyodbc 将表从 MS Access 迁移到 Postgres?

使用 pyodbc 将带日期的数据上传到 MS Access 数据库

使用 Pyodbc 连接到具有用户定义函数的 MS Access 文件

无法使用 pyodbc 在 Access 数据库的表中插入/更新长文本字段

在 pyodbc 中执行 SELECT 查询时,来自 ODBC MS Access 驱动程序的“系统资源超出”错误