Temos um aplicativo MS Access realmente enorme, desenvolvido internamente inicialmente para nossas necessidades pessoais, que depois foi transformado em um software comercial e vendido com sucesso. O software é uma espécie de "software completo para o seu negócio" e contém vários módulos, incluindo Sistema de Gerenciamento de Documentos, Planejamento de Recursos Empresariais, Gerenciamento de Inventário, Gerenciamento de Relacionamento com Cliente, Análise de Dados etc. Estamos bastante satisfeitos com o atual funcionalidade do aplicativo, mas para atender às solicitações de nossos clientes, percebemos que precisamos mudar para algo novo.
Decidimos mudar gradualmente nosso aplicativo para .Net porque podemos seguir o Visual Basic .Net: embora seja uma nova linguagem para a maioria dos desenvolvedores aqui, temos um profundo conhecimento do VBA e várias dezenas de pequenos projetos implementados no VB6.
Já começamos a mover a funcionalidade da camada de dados de nosso aplicativo para o MS SQL Server, para que todas as manipulações e pesquisas de dados sejam realizadas diretamente no servidor.
O que procuramos são práticas recomendadas para mover gradualmente nossa GUI abrangente (cerca de 500 a 600 formulários diferentes, incluindo subformulários, cerca de 200 relatórios com suporte em vários idiomas etc.). Após a recente solicitação do nosso cliente em potencial para implementar criptografia de dados assíncrona em documentos no DMS, também ficaríamos felizes em separar completamente essa parte do MS Access e implementá-la no .Net.
A questão é como integrar perfeitamente o aplicativo .Net ao sistema existente do MS Access, para que possamos invocá-lo com determinados parâmetros (direitos do usuário etc.) e permitir a troca de dados entre esse aplicativo e o aplicativo MS Access em execução.
EDITAR:
Tentamos aplicar algumas práticas do livro de Martin Fowler " Enterprise intergration patterns " para obter alguma integração entre o aplicativo MS Access e alguns pequenos utilitários que implementamos no .Net para diversas necessidades. Mas nós apenas conseguimos usar o padrão "banco de dados compartilhado" e não estávamos realmente satisfeitos com nossa solução.
Por exemplo, implementamos um pequeno utilitário em execução como um serviço do Windows que baixa automaticamente todas as mensagens do servidor de correio usando a conexão POP3 e as armazena em uma tabela, enquanto todos os anexos são armazenados no sistema de arquivos.
O que fizemos principalmente foi usar o ADO.NET para acessar diretamente os bancos de dados do MS Access no formato MDB e preencher a tabela com alguns dados processados (como os dados sobre mensagens de email do exemplo acima: temos campos para FROM, TO, CC, BCC, Sujeito e Corpo).
Não há absolutamente nenhum problema em trabalhar com o formato de dados MDB da .Net , além disso, não queremos ficar com o MDB e aumentar o tamanho de tudo para o MS SQL Server 2008 - isso nos dá muito mais liberdade em relação ao gerenciamento e escalabilidade de dados.
O principal problema aqui é que não sabemos como implementar uma espécie de "retorno de chamada" no Access para que possamos disparar a execução de determinado código VBA na atualização de dados.
Tínhamos grandes esperanças de que o MS Access 2010 suportasse gatilhos de atualização e inserção de tabelas de dados , mas descobrimos que só podemos usar macros do MS Access para esses gatilhos e não há como executar qualquer código VBA personalizado dentro do gatilho.
Também tentamos algumas soluções com o envio de pressionamentos de teclas diretamente para a janela do MS Access para imitar alguns requisitos de dados invocados pelo usuário. Isso funciona, mas não achamos que seja uma solução confiável que possa ser usada na produção.
Também analisamos o DDE para MS Access, mas não conseguimos encontrar uma boa solução de exemplo implementando comandos DDE e usando-os para troca de dados e memória na memória.
Portanto, o principal problema é ter o aplicativo MS Access e .Net coexistindo e interagindo entre si.
EDIT2 :
Esqueci de mencionar o que também implementamos na biblioteca MSMQ no VBA para passagem de mensagens entre .Net e MS Access, o problema foi novamente a falta de retorno de chamada aqui: realmente tivemos que pesquisar a fila em busca de novas mensagens e, uma vez que o VBA realmente não suporta multi-threading, não era realmente uma solução agradável.