针对Access数据库的Pyodbc查询出现“未实现可选功能”错误

时间:2019-01-16 15:45:46

标签: python ms-access select pyodbc pypyodbc

对于任何可以帮助的人,请先谢谢您。
我正在运行64位Windows 10、64位Office和64位python 3.7.2

使用pyodbc,我正在尝试执行如下Select语句:

"SELECT * FROM EconVars WHERE Year(ValueDate) = 1999"

为此,我的代码如下:

existquery = """SELECT * FROM EconVars WHERE Year(ValueDate) = ?"""        
params = (1999,)
cursor.execute(existquery,params)

运行此命令时,出现以下错误     pyodbc.Error :(“ HYC00”,“ [HYC00] [Microsoft] [ODBC Microsoft Access     驱动程序]未实现可选功能(106)(SQLBindParameter)')

我读过这可能是因为pyodbc在传递整数值时遇到问题,因此我尝试将其转换为float,因为这似乎对某些人有用。因此,我的代码变为:

existquery = """SELECT * FROM EconVars WHERE Year(ValueDate) = ?"""
params = (float(1999),)
cursor.execute(existquery,params)

运行此代码时,程序仅在cursor.execute行上停止,没有错误。

我还尝试过使用pypyodbc模块,并且在运行上面完全相同的代码时也尝试过

existquery = """SELECT * FROM EconVars WHERE Year(ValueDate) = ?"""
params = [1999,]
cursor.execute(existquery,params)

我收到以下错误

OSError: exception: access violation reading 0x0000000000000000

我已经确认游标连接没有问题,因为同一游标成功运行了INSERT命令。

如果有人有任何想法,将不胜感激。

更新1

感谢您的回复,我已将其降级为4.0.24,但错误仍然存​​在,下面的代码仍会崩溃而没有错误

existquery = """SELECT * FROM EconVars WHERE Year(ValueDate) = ?"""
params = (1999,)
cursor.execute(existquery,params)
existData = cursor.fetchall()

另外,传递字符串也不起作用

existquery = """SELECT * FROM EconVars WHERE Year(ValueDate) = ?"""
params = ('1999',)
cursor.execute(existquery,params)
existData = cursor.fetchall()

我可以通过传递一个字符串日期(例如

)来使其工作
existquery = """SELECT * FROM EconVars WHERE ValueDate = ?"""
params = ('#01/04/1999#',)
cursor.execute(existquery,params)
existData = cursor.fetchall()

但是,显然,这在查找特定年份的数据点时无济于事。由于上述日期实际上被解释为1月4日,因此也导致了英国/美国日期问题。

1 个答案:

答案 0 :(得分:1)

我能够重现您的问题。当这些查询使用整数参数时,pyodbc 4.0.25中引入的更改似乎会导致对Access数据库的查询出现问题。

该问题已在GitHub here上报告。同时,降级到pyodbc 4.0.24。

更新1

如果降级到4.0.24后仍然遇到困难,则该问题可能是特定于数据库本身的。请考虑使用GitHub issue和可以重现此问题的示例数据库打开单独的MCVE