2017-03-16 239 views
2

我試圖用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中使用正常工作。而且,連接正常,因爲其他查詢正確執行。 我在做什麼錯?

回答

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)