太少参数错误,而没有参数占位符使用

问题描述:

我试图用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) 

查询本身,如果在MS-Access中使用正常工作。而且,连接正常,因为其他查询正确执行。 我在做什么错?

这样的查询中的常量是有问题的 - 您不知道布尔值,字符串等的确切底层语法 - 即使它在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)