Ошибка «Необязательная функция не реализована» при запросе pyodbc к базе данных Access - PullRequest
0 голосов
/ 16 января 2019

Всем, кто может помочь, заранее спасибо.
Я использую 64-битные Windows 10, 64-битный офис и 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 есть проблемы с передачей целочисленных значений, поэтому я попытался преобразовать в число с плавающей точкой, поскольку это, похоже, сработало для некоторых людей. Поэтому мой код становится:

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()

Однако, очевидно, что это не помогает при поиске точек данных за определенный год. Это также приводит к проблемам с датами в Великобритании и США, поскольку вышеприведенная дата фактически интерпретируется как 4 января.

1 Ответ

0 голосов
/ 16 января 2019

Мне удалось воспроизвести вашу проблему. Похоже, что изменение, внесенное в pyodbc 4.0.25, вызывает проблемы с запросами к базе данных Access, когда эти запросы используют целочисленные параметры.

О проблеме сообщалось на GitHub здесь . В то же время, понижение до pyodbc 4.0.24.

Обновление

Эта проблема была исправлена ​​в pyodbc 4.0.27.

...