Вызывать код C# из Access Data-based Data Macro?

Можно ли каким-то образом вызывать код C# из файла базы данных MS Access (не из приложения Access)?

Мой сценарий, когда что-то случится в какой-то таблице, я должен вызвать код C# (например, веб-сервис).

Я читал, что MS Access не поддерживает триггеры, но в нем есть процедуры или что-то под названием Data Macros.

Я еще не знаю версию Access.

2 ответа

Макросы данных были введены в MS Access 2010, и да, вы можете вызывать функции dll, созданные в C#, из кода VBA. Макрос данных вызывает функцию VBA в Access, VBA вызывает функцию C# dll или запускает внешнее приложение с помощью команд оболочки.

ОБНОВИТЬ

К сожалению, невозможно выполнить какой-либо код VBA из Data Macro, если используется внешний интерфейс без доступа, Access требует среды для выполнения кода, если таблица изменена через ODBC приложением без доступа, среда не существует и выполнение завершится неудачно.

В дополнение к ответу Сергея управляемые событиями макросы данных в Access могут вызывать функции VBA, только если

  1. таблица обновляется из самого Microsoft Access (MSACCESS.EXE), и
  2. код VBA доступен для файла базы данных Access, где вызывается обновление таблицы.

Так, например, если макрос данных "Перед изменением" вызывает следующую функцию, чтобы извлечь имя текущего пользователя (чтобы он мог вставить имя в поле в этой таблице, например, [CreatedBy] или [updatedBy])

Public Function GetUserName()
    Dim wshNet As Object  ' WshNetwork
    Set wshNet = CreateObject("WScript.Network")  ' New WshNetwork
    GetUserName = wshNet.UserName
    Set wshNet = Nothing
End Function

тогда применяются следующие условия:

Обновление таблицы из приложения без доступа

Приложение без доступа (например, приложение.NET, использующее System.Data.OleDb или System.Data.Odbc) просто не может обновить таблицу. Это выдаст ошибку, сказав

Функция GetUserName недопустима для выражений, используемых в макросах данных.

Обновление связанной таблицы из внешнего интерфейса Access

Клиентский интерфейс Access может обновить таблицу при условии, что код VBA для функции доступен для файла внешнего интерфейса (.accdb, .accde и т. Д.). Входной файл не может напрямую запускать код VBA, который хранится во внутреннем файле (где находится таблица с макросом данных). Нам нужно либо

  • скопировать модуль (ы) VBA из внутреннего файла в файл внешнего интерфейса или
  • используйте ссылку VBA в файле переднего плана, чтобы включить код из внутреннего конца:

Reference.png

Другие вопросы по тегам