У нас дійсно величезний додаток 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 насправді не підтримує багатонарізка це було не дуже приємне рішення.