【问题标题】:ERROR [07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1 when doing DELETE错误 [07002] [Microsoft][ODBC Microsoft Access Driver] 参数太少。执行 DELETE 时预期为 1
【发布时间】: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?

【问题讨论】:

标签: python ms-access


【解决方案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”那样做
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2016-07-09
相关资源
最近更新 更多