对于任何可以帮助的人,请先谢谢您。
我正在运行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命令。
如果有人有任何想法,将不胜感激。
感谢您的回复,我已将其降级为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日,因此也导致了英国/美国日期问题。
答案 0 :(得分:1)
我能够重现您的问题。当这些查询使用整数参数时,pyodbc 4.0.25中引入的更改似乎会导致对Access数据库的查询出现问题。
该问题已在GitHub here上报告。同时,降级到pyodbc 4.0.24。
如果降级到4.0.24后仍然遇到困难,则该问题可能是特定于数据库本身的。请考虑使用GitHub issue和可以重现此问题的示例数据库打开单独的MCVE。