Ошибка MSAccess веб-сервера: вы отменили предыдущую операцию - PullRequest
0 голосов
/ 29 февраля 2020

Я получаю ошибку crypti c MSAccess, и я не могу понять, что ее вызывает.

У меня есть следующие настройки :

  • Golang / веб-сервер Gin (Windows), вызывающий
  • скомпилированный python скрипт (.exe), который использует COM для вызова макроса
  • MSAccess для экспорта запроса к базе данных в определенный формат.

У меня также есть примитивная регистрация в нескольких слоях, чтобы помочь я отлаживаю в такой странной архитектуре.

Ошибка регистрируется с python: <class 'pywintypes.com_error'>: (-2147352567, 'Ausnahmefehler aufgetreten.', (0, None, 'Sie haben den vorherigen Vorgang abgebrochen.', 'vbaac10.chm', 5738, -2146826287), None)

, что примерно соответствует

<class 'pywintypes.com_error'>: (-2147352567, 'Unknown error.', (0, None, 'You canceled the previous operation.', 'vbaac10.chm', 5738, -2146826287), None).

Странно то, что если я сам запускаю исполняемый файл python, все работает как положено, и никаких ошибок не возникает. Однако, если я вызываю его из моего golang кода (веб-сервер / тесты), он выдает «Вы отменили предыдущую операцию». ошибка, которая, насколько я могу судить по чтению в Интернете, возникает, когда имя макроса или имя таблицы неверны.

Единственная гипотеза, которую я имею сейчас, состоит в том, что из-за различных прав пользователя, когда мой golang выполняет его, когда я выполняю его сам?

Вот соответствующий python код, используемый для вызова макроса:

import pythoncom
import win32com.client
import sys
import logger

log = logger.Logger("data-sync.txt")

def export_db(db_path):
    try:        
        log.info(f"Exporting database under: {db_path}")

        log.info("- Connecting to Access COM interface.")
        oAccess = win32com.client.Dispatch("Access.Application")

        log.info("- Opening provided database.")
        oAccess.OpenCurrentDatabase(db_path, False)

        log.info("- Running Macro \"ExportDb\"")    
        oAccess.DoCmd.RunMacro("ExportDb")

        log.info("- Running complete, closing database")        
        oAccess.CloseCurrentDatabase()
    except Exception as err:        
        log.error(type(err), err)
        pass
    pass

Я трижды проверил пути и имя вызываемого макроса, любые другие идеи приветствуются.

1 Ответ

0 голосов
/ 02 марта 2020

Я понял, по крайней мере, почему это частично не работает. Очевидно, в моем исполняемом файле у меня был жестко заданный путь по умолчанию, подобный следующему:

default_db_path = r"C:\Users\some\path\DummyData.accdb"

Однако я предоставлял путь следующего формата:

export-database.exe "C:/Users/some/path/DummyData.accdb"

Различные косые черты были, по-видимому, достаточно для доступа или интерфейса COM, чтобы интерпретировать его как относительный путь и cra sh.

К сожалению, мой тест, который делает то же самое, все еще выдает ту же ошибку для исправленных путей. Мой продуктивный код работает, поэтому я отмечу этот вопрос как ответивший, и если я найду причину проблемы с тестом, я обновлю ее.

Редактировать: Как сообщалось, я натолкнулся на проблема, которая возникала с моими тестами. В своих тестах я копировал базу данных доступа в подпапку для работы с ней и очищал ее после моих тестов.

Видимо, вы должны активировать выполнение макросов в центре доверия Access (это является глобальным параметром). Я активировал макрос в исходной базе данных, но после автоматического копирования в моих тестах я, по-видимому, получал уведомление в самой базе данных, когда открывал фактический файл базы данных и пытался выполнить вручную макро!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...