参数太少错误,但未使用参数占位符

2024-10-06 08:07:07 发布

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

我试图使用PYODBC在Access数据库中执行SQL查询,得到以下错误:

pyodbc.Error: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1. (-3010) (SQLExecDirectW)')

问题是我没有使用任何其他参数。代码如下:

access_con_string = r"Driver={};Dbq={};".format(driver, base)
cnn = pyodbc.connect(access_con_string)
db_cursor = cnn.cursor()
expression = """SELECT F_ARODES.ARODES_INT_NUM, F_ARODES.TEMP_ADRESS_FOREST,F_AROD_LAND_USE.ARODES_INT_NUM, F_ARODES.ARODES_TYP_CD
FROM F_ARODES LEFT JOIN F_AROD_LAND_USE ON F_ARODES.ARODES_INT_NUM = F_AROD_LAND_USE.ARODES_INT_NUM
WHERE (((F_AROD_LAND_USE.ARODES_INT_NUM) Is Null) AND ((F_ARODES.ARODES_TYP_CD)="wydziel") AND ((F_ARODES.TEMP_ACT_ADRESS)=True));"""

db_cursor.execute(expression)

查询本身,如果在msaccess内部使用,效果很好。另外,连接是可以的,因为其他查询都可以正确执行。 我做错什么了?在


Tags: stringaccessusedriverconcursornumcnn
2条回答

这种查询中的常量是有问题的-你永远不知道布尔值、字符串等的确切底层语法-即使它在MS Access中工作,它在你使用的中介库中也可能是不同的。在

最安全的方法是提取它们作为参数:

expression = """SELECT F_ARODES.ARODES_INT_NUM, F_ARODES.TEMP_ADRESS_FOREST,F_AROD_LAND_USE.ARODES_INT_NUM, F_ARODES.ARODES_TYP_CD FROM F_ARODES LEFT JOIN F_AROD_LAND_USE ON F_ARODES.ARODES_INT_NUM = F_AROD_LAND_USE.ARODES_INT_NUM WHERE (((F_AROD_LAND_USE.ARODES_INT_NUM) Is Null)
AND ((F_ARODES.ARODES_TYP_CD)=?) AND ((F_ARODES.TEMP_ACT_ADRESS)=?));"""

db_cursor.execute(expression, "wydziel", True)

我也遇到了类似的问题,我试图用pyodbc执行更新。在Access中执行时,查询运行良好,使用应用程序时也一样(它允许从应用程序内部进行一些查询)。但是在python中运行pyodbc时,相同的文本会抛出错误。我确定问题是双引号(OP的查询也有一组双引号)。当我用单引号替换它们时,查询开始工作了。在

这不起作用:

Update ApplicationStandards Set ShortCutKey = "I" Where ShortName = "ISO"

这样做可以:

^{pr2}$

相关问题 更多 >