У нас действительно огромное приложение MS Access, изначально разработанное для наших личных нужд, которое затем было превращено в коммерческое программное обеспечение и успешно продано. Программное обеспечение является своего рода «универсальным программным обеспечением для вашего бизнеса» и содержит несколько модулей, в том числе систему управления документами, планирование ресурсов предприятия, управление запасами, управление взаимоотношениями с клиентами, анализ данных и т. Д. функциональность приложения, но для того, чтобы удовлетворить запросы наших клиентов, мы понимаем, что должны перейти к чему-то новому.
Мы решили постепенно переместить наше приложение в сторону .Net, потому что мы можем придерживаться Visual Basic .Net: хотя это и является новым языком для большинства разработчиков, у нас есть глубокие знания VBA и несколько десятков небольших проектов, реализованных в VB6.
Мы уже начали переносить функциональность уровня данных нашего приложения на MS SQL Server, чтобы каждая манипуляция данными и поиск выполнялись непосредственно на сервере.
Мы ищем лучшие практики для постепенного перемещения нашего обширного графического интерфейса (около 500-600 различных форм, включая подчиненные формы, около 200 отчетов с многоязычной поддержкой и т. Д.). Следуя недавнему запросу нашего потенциального клиента о внедрении асинхронного шифрования данных в документах в DMS, мы также были бы рады полностью отделить эту часть от MS Access и внедрить ее в .Net.
Вопрос заключается в том, как легко интегрировать приложение .Net с существующей системой MS Access, чтобы мы могли вызывать его с определенными параметрами (правами пользователей и т. Д.) И обеспечить обмен данными между этим приложением и запущенным приложением MS Access.
РЕДАКТИРОВАТЬ:
Мы попытались применить некоторые методы из книги Мартина Фаулера « Шаблоны корпоративной интеграции» для достижения некоторой интеграции между приложением MS Access и некоторыми небольшими утилитами, которые мы внедрили в .Net для различных нужд. Но нам удалось использовать шаблон «общая база данных», и мы не были удовлетворены нашим решением.
Например, мы реализовали небольшую утилиту, работающую в качестве службы Windows, которая автоматически загружает все сообщения с почтового сервера с использованием соединения POP3 и сохраняет их в одной таблице, тогда как все вложения хранятся в файловой системе.
В основном мы использовали ADO.NET для прямого доступа к базам данных MS Access в формате MDB и для заполнения таблицы некоторыми обработанными данными (например, данными о почтовых сообщениях из приведенного выше примера: у нас есть поля для FROM, TO, CC, BCC, Тема и Тело).
Работать с форматом данных MDB из .Net абсолютно не проблема , более того, мы не хотим оставаться с MDB и почти все изменили до MS SQL Server 2008 - это дает нам гораздо большую свободу в отношении управления данными и масштабируемости.
Основная проблема здесь в том, что мы не знаем, как реализовать своего рода «обратный вызов» в Access, чтобы мы могли инициировать выполнение определенного кода VBA при обновлении данных.
Мы возлагали большие надежды на то, что MS Access 2010 будет поддерживать триггеры обновления и вставки для таблиц данных , но оказалось, что мы можем использовать макросы MS Access только для этих триггеров, и нет способа выполнить какой-либо пользовательский код VBA внутри триггера.
Мы также попробовали некоторые решения с отправкой нажатий клавиш непосредственно в окно MS Access, чтобы имитировать некоторые пользовательские запросы данных. Это работает, но мы не думаем, что это реальное решение, которое можно использовать в производстве.
Мы также изучили DDE для MS Access, но не смогли найти хорошего примера решения, реализующего команды DDE и использующего их для обмена данными в памяти и обмена командами.
Таким образом, основная проблема заключается в том, чтобы приложения MS Access и .Net сосуществовали и взаимодействовали друг с другом.
EDIT2 :
Я забыл упомянуть, что мы также реализовали библиотеку MSMQ в VBA для передачи сообщений между .Net и MS Access, проблема снова заключалась в отсутствии обратного вызова: нам действительно пришлось опрашивать очередь на наличие новых сообщений и учитывая, что VBA на самом деле не поддерживает многопоточность это не было действительно хорошим решением.