Дополнительная функция не реализована ошибка с запросом pyodbc к базе данных Access

Всем, кто может помочь, заранее спасибо.
Я использую 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 Driver] Дополнительная функция не реализована (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()

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


person user78913    schedule 16.01.2019    source источник
comment
Разве для построения запроса не подойдет простое объединение строк? т.е. existquery = "SELECT * FROM EconVars WHERE Year(ValueDate) = " + str(1999)   -  person shahkalpeshp    schedule 16.01.2019
comment
Это также просто останавливает код и выходит без сообщения об ошибке.   -  person user78913    schedule 16.01.2019
comment
Что возвращает pyodbc.version?   -  person Gord Thompson    schedule 16.01.2019
comment
Привет, это версия 4.0.25   -  person user78913    schedule 16.01.2019
comment
Я обнаружил, что выполнение оператора existquery = """SELECT * FROM EconVars WHERE ValueDate = #01/05/1999#""" не остановится на cursor.execute(existquery) cursor.fetchall, однако курсор содержит -1 строку, что неверно. Является ли счетчик строк правильным способом определить, есть ли у курсора записи?   -  person user78913    schedule 16.01.2019
comment
Является ли счетчик строк правильным способом определить, есть ли у курсора записи? - Нет, счетчик строк применяется только к операторам DML (INSERT, UPDATE, DELETE).   -  person Gord Thompson    schedule 16.01.2019
comment
Спасибо, я получил то, что мне нужно здесь, используя len (cursor.fetchall)   -  person user78913    schedule 17.01.2019


Ответы (1)


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

Об этой проблеме было сообщено на GitHub, здесь. А пока перейдите на pyodbc 4.0.24.

Обновлять

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

person Gord Thompson    schedule 16.01.2019