Python:pyodbc,microsoftaccess:更新表中的日期,使用#date qualifi

2024-04-28 13:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python中的pyodbc更新microsoftaccess数据库中的一些记录。我正在努力更新Access中的日期/时间字段,这将需要sql语句中的日期限定符符号。在

语句的示例可以是

sql = '''UPDATE [TABLE] SET[STARTDATE]=#2018-10-25# WHERE[KEYCOLUMN]=12345;'''

使用参数查询

sql = '''UPDATE [TABLE] SET[STARTDATE]=? WHERE[KEYCOLUMN]=?;'''
params = (#2018-10-25#, 12345)
cursor.execute(sql, params)

但是,由于数据限定符所需的符号,执行会崩溃。 另外,使用datetime库也没有帮助,因为以下参数也会导致执行失败:

^{pr2}$

更新DateTime字段(包括清空Access数据库中的DateTime字段)的正确语法/解决方法是什么?在

尝试不同尝试时的错误代码(使用实际的表名和字段名,而不是上面示例中使用的示例名)

以字符串形式传递日期时

SQL: UPDATE [Status Scorecard] [IN:Start Execute] = ? WHERE [IN:ID]=?;
Params: ('2015-09-14', '47977')
Error:(<class 'pyodbc.ProgrammingError'>, ProgrammingError('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement. (-3503) (SQLExecDirectW)'), <traceback object at 0x07E24120>)

传递带有#日期分隔符符号的数据时:

sql = '''UPDATE [Status Scorecard] [IN:Start Execute] = ? WHERE [IN:ID]=?;'''
params = (#2015-09-14#, '47977')
print(params)
r = axSCORECARD.updateSQL(sql, params)

代码不运行,因为#符号被视为注释,导致代码语法错误。在

以字符串形式传递数据时,请在字符串内使用#日期分隔符:

SQL: UPDATE [Status Scorecard] [IN:Start Execute] = ? WHERE [IN:ID]=?;
Params: ('#2015-09-14#', '47977')
Error:(<class 'pyodbc.ProgrammingError'>, ProgrammingError('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement. (-3503) (SQLExecDirectW)'), <traceback object at 0x07E24148>)

当作为一个日期时间.日期调用(在将“import datatime”添加到脚本后):

SQL: UPDATE [Status Scorecard] [IN:Start Execute] = ? WHERE [IN:ID]=?;
Params: (datetime.date(2015, 9, 14), '47977')
Error:(<class 'pyodbc.ProgrammingError'>, ProgrammingError('42000', '[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement. (-3503) (SQLExecDirectW)'), <traceback object at 0x07E240D0>)

Tags: inidexecutesqlaccessstatus符号update
1条回答
网友
1楼 · 发布于 2024-04-28 13:27:06

哈希标记(#)分隔符只对SQL命令文本本身中的日期文本是必需的。在参数化查询中,它们不是必需的(事实上是无效的)。在

通过pyodbc 4.0.24验证,这是可行的:

sql = "UPDATE [Status Scorecard] SET [IN:Start Execute] = ? WHERE [IN:ID] = ?"
params = (datetime.date(2015, 9, 14), '47977')
crsr.execute(sql, params)
cnxn.commit()

结果:

^{pr2}$

要“清空”日期,请使用None

params = (None, '47977')

相关问题 更多 >