错误 [07002] [Microsoft][ODBC Microsoft Access Driver] 参数太少。执行 DELETE 时预期为 1
Posted
技术标签:
【中文标题】错误 [07002] [Microsoft][ODBC Microsoft Access Driver] 参数太少。执行 DELETE 时预期为 1【英文标题】:ERROR [07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1 when doing DELETE 【发布时间】:2021-08-19 06:07:03 【问题描述】:我有这个问题:
query_del = '''DELETE * FROM Students WHERE Students.[last_name] = "Q";'''
我这样做是为了执行:
conn= pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb, *.accdb);DBQ=C:\XXX\Database.accdb;')
curs = conn.cursor()
curs.execute(query_del)
curs.commit()
但是我收到了这个错误:
ERROR [07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1
数据库当前是这样的:
ID last_name first_name 电子邮件地址
3 布欧 B C 4 Cuuuu C D 70 W W 72 W W 74 W W 76 W W 78 W W 80 W W 82 W W 84 W W 86 W W 87问问 88 W W 89问问 90 瓦特
编辑 1: 这种方式的查询有效:
query_del = '''DELETE * FROM Students WHERE Students.[last_name] = 'Q';'''
但我确实需要在变量中使用双引号,因为我有一些姓氏,例如x'xxx'x
,所以我不知道如何删除它们。带有简单双引号的查询在 Access 中运行良好:
DELETE FROM Students WHERE Students.[last_name] = "W"; #Works in Access
DELETE FROM Students WHERE Students.[last_name] = 'W'; #Also Works in Access
如何将其翻译成 python 和 pyodbc?
【问题讨论】:
关于包含撇号的文本值的问题,请切换到parameter query 【参考方案1】:考虑:query_del = "DELETE FROM Students WHERE [last_name] = 'Q'"
注意引号和撇号分隔符的交换。字段的 * 通配符不是必需的,但不应该造成伤害。
如果使用撇号对值进行硬编码,则将撇号加倍,以便将其转义并强制视为文字文本:='x''x'
。如果通过引用表单上的控件来编码动态输入,则必须连接并使用 Replace 来处理数据中撇号的可能性:
query_del = "DELETE FROM Students WHERE [last_name] = '" & Replace(Me.tbxName, "'", "''") & "'"
或者使用参数-查看How do I use SQL parameters with python?
变量集是query_del
,但执行引用query
所以试试:curs.execute(query_del)
【讨论】:
之所以有效,当然是因为 ODBC 驱动程序默认启用了 ANSI 引号,因此将"Q"
解释为字段名称,而不是文本字符串
如果我想删除一个姓氏:x'xxx 怎么办?我不能用'x'xxx'来做,我需要像“x'xxx”那样做以上是关于错误 [07002] [Microsoft][ODBC Microsoft Access Driver] 参数太少。执行 DELETE 时预期为 1的主要内容,如果未能解决你的问题,请参考以下文章
RODBC 与 ms-access 错误 07002 17 [Microsoft][ODBC Microsoft Access Driver]COUNT 字段不正确
pyodbc.Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] 参数太少。预期为 9. (-3010) (SQLE