我正在尝试使用PYODBC在Access数据库中执行SQL查询,我收到以下错误:
pyodbc.Error:('07002','[07002] [Microsoft] [ODBC Microsoft Access Driver] 参数太少。预期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中使用正常。此外,连接正常,因为其他查询正确执行。 我做错了什么?
答案 0 :(得分: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)
答案 1 :(得分:1)
我有一个类似的问题,我尝试使用pyodbc执行更新。在Access中执行时,查询工作正常,与使用应用程序时相同(它允许在应用程序内进行某些查询)。但是,当使用pyodbc在python中运行时,相同的文本将引发错误。我确定问题是双引号(OP的查询也有一组)。当我用单引号将它们替换时,查询开始起作用。
这不起作用:
Update ApplicationStandards Set ShortCutKey = "I" Where ShortName = "ISO"
这样做:
Update ApplicationStandards Set ShortCutKey = 'I' Where ShortName = 'ISO'