2017-03-22 65 views
3

我得到了一堆應該在Access數據庫中作爲我的Python腳本的一部分執行的查詢。不幸的是,直接在MS Access中使用的查詢給出了一些輸出記錄,在Python腳本中沒有返回任何內容(也沒有錯誤)。與數據庫和一般語法的連接應該沒問題,因爲簡單的查詢(比如從表中選擇一列)可以很好地工作。下面是這些給定的查詢之一的代碼:查詢輸出不一致的可能原因

import pyodbc 

baza = r"C:\base.mdb" 
driver = "{Microsoft Access Driver (*.mdb, *.accdb)}" 

access_con_string = r"Driver={};Dbq={};".format(driver, baza) 
cnn = pyodbc.connect(access_con_string) 
db_cursor = cnn.cursor() 

expression = """SELECT F_PARCEL.PARCEL_NR, F_PARCEL_LAND_USE.AREA_USE_CD, F_PARCEL_LAND_USE.SOIL_QUALITY_CD, F_ARODES.TEMP_ADRESS_FOREST, F_SUBAREA.AREA_TYPE_CD, F_AROD_LAND_USE.AROD_LAND_USE_AREA, F_PARCEL.COUNTY_CD, F_PARCEL.DISTRICT_CD, F_PARCEL.MUNICIPALITY_CD, F_PARCEL.COMMUNITY_CD, F_SUBAREA.SUB_AREA 
FROM F_PARCEL INNER JOIN (F_PARCEL_LAND_USE INNER JOIN ((F_ARODES INNER JOIN F_AROD_LAND_USE ON F_ARODES.ARODES_INT_NUM = F_AROD_LAND_USE.ARODES_INT_NUM) INNER JOIN F_SUBAREA ON F_ARODES.ARODES_INT_NUM = F_SUBAREA.ARODES_INT_NUM) ON (F_PARCEL_LAND_USE.SHAPE_NR = F_AROD_LAND_USE.SHAPE_NR) AND (F_PARCEL_LAND_USE.PARCEL_INT_NUM = F_AROD_LAND_USE.PARCEL_INT_NUM)) ON F_PARCEL.PARCEL_INT_NUM = F_PARCEL_LAND_USE.PARCEL_INT_NUM 
WHERE (((F_ARODES.TEMP_ADRESS_FOREST) Like ?) AND ((F_AROD_LAND_USE.AROD_LAND_USE_AREA)<?) AND ((F_ARODES.TEMP_ACT_ADRESS)= ?)) 
ORDER BY F_PARCEL.PARCEL_NR, F_PARCEL_LAND_USE.SHAPE_NR;""" 

rows = db_cursor.execute(expression, ("14-17-2-03*", 0.0049, True)).fetchall() 

for row in rows: 
    print row 

cnn.close() 

我知道,從在MS Access查詢生成器生成的查詢,所以我在想,也許這會導致差異,但在另一方面,這是仍然訪問數據庫。

無論如何,看來,這個問題是在SQL中,所以我想知道哪些元素可能會導致直接在MS Access和pyodbc連接執行查詢之間的不同輸出?

回答

2

由於在Access本身中運行的查詢與從外部應用程序運行的查詢之間LIKE通配符的區別,您會感到絆倒。

從Access內部運行查詢時,您需要使用星號作爲通配符:"14-17-2-03*"

從外部應用程序(如您的Python應用程序)運行查詢時,需要使用百分號作爲通配符:"14-17-2-03%"

+0

ALIKE怎麼樣? – Fionnuala

相關問題