【问题标题】:Too few parameters error, while no parameters placeholders used参数太少错误,而没有使用参数占位符
【发布时间】:2017-08-07 15:38:27
【问题描述】:

我正在尝试使用 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 中使用,查询本身可以正常工作。此外,连接正常,因为其他查询已正确执行。 我做错了什么?

【问题讨论】:

    标签: python ms-access pyodbc


    【解决方案1】:

    此类查询中的常量是有问题的——你永远不知道布尔值、字符串等的确切底层语法——即使它在 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)
    

    【讨论】:

      【解决方案2】:

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

      这不起作用:

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

      这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-16
        • 2018-04-22
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        相关资源
        最近更新 更多