Wir haben eine sehr große MS Access-Anwendung, die ursprünglich für unsere persönlichen Bedürfnisse entwickelt und dann in eine kommerzielle Software umgewandelt und erfolgreich verkauft wurde. Die Software ist eine Art "Allround-Software für Ihr Unternehmen" und enthält mehrere Module, einschließlich Dokumentenmanagementsystem, Enterprise Resource Planning, Bestandsmanagement, Kundenbeziehungsmanagement, Datenanalyse usw. Wir sind mit dem aktuellen Stand sehr zufrieden Funktionalität der Anwendung, aber um die Anforderungen unserer Kunden zu erfüllen, müssen wir auf etwas Neues umsteigen.
Wir haben uns entschlossen, unsere Anwendung schrittweise auf .NET umzustellen, da wir uns an Visual Basic .NET halten können. Obwohl dies für die meisten Entwickler eine neue Sprache ist, verfügen wir über fundierte Kenntnisse in VBA und einige Dutzend kleiner Projekte, die in VB6 implementiert sind.
Wir haben bereits damit begonnen, die Datenschichtfunktionalität unserer Anwendung auf MS SQL Server zu verlagern, sodass jede Datenmanipulation und -suche direkt auf dem Server ausgeführt wird.
Was wir suchen, sind bewährte Methoden zum schrittweisen Verschieben unserer umfangreichen Benutzeroberfläche (ca. 500-600 verschiedene Formulare, einschließlich Unterformulare, ca. 200 Berichte mit mehrsprachiger Unterstützung usw.). Nach der jüngsten Anfrage unseres potenziellen Kunden, eine asynchrone Datenverschlüsselung für Dokumente in DMS zu implementieren, würden wir diesen Teil auch gerne vollständig von MS Access entkoppeln und in .Net implementieren.
Die Frage ist, wie die .NET-Anwendung nahtlos in das vorhandene MS Access-System integriert werden kann, damit wir sie mit bestimmten Parametern (Benutzerrechten usw.) aufrufen und den Datenaustausch zwischen dieser Anwendung und der laufenden MS Access-Anwendung ermöglichen können.
BEARBEITEN:
Wir haben versucht, einige Methoden aus Martin Fowlers Buch " Enterprise Intergration Patterns " anzuwenden , um eine gewisse Integration zwischen der MS Access-Anwendung und einigen kleinen Dienstprogrammen zu erreichen, die wir für verschiedene Anforderungen in .Net implementiert haben. Wir haben es aber nur geschafft, das Muster "Shared Database" zu verwenden und waren mit unserer Lösung nicht wirklich zufrieden.
Zum Beispiel haben wir ein kleines Hilfsprogramm implementiert, das als Windows-Dienst ausgeführt wird und alle Nachrichten automatisch über eine POP3-Verbindung vom Mailserver herunterlädt und in einer Tabelle speichert, während alle Anhänge im Dateisystem gespeichert werden.
Wir haben hauptsächlich ADO.NET verwendet, um direkt auf MS Access-Datenbanken im MDB-Format zuzugreifen und die Tabelle mit einigen verarbeiteten Daten zu füllen (wie die Daten zu E-Mail-Nachrichten aus dem obigen Beispiel: Wir haben Felder für FROM, TO, CC, BCC, Thema und Körper).
Es ist absolut kein Problem, mit dem MDB-Datenformat von .Net zu arbeiten . Außerdem möchten wir nicht bei MDB bleiben und haben fast alles auf MS SQL Server 2008 aufgerüstet - dies gibt uns viel mehr Freiheit bei der Datenverwaltung und Skalierbarkeit.
Das Hauptproblem hierbei ist, dass wir nicht wissen, wie eine Art "Rückruf" in Access implementiert wird , damit wir die Ausführung eines bestimmten VBA-Codes bei der Datenaktualisierung auslösen können.
Wir hatten große Hoffnungen, dass MS Access 2010 Update- und Insert-Trigger für Datentabellen unterstützt , aber es stellte sich heraus, dass wir für diese Trigger nur MS Access-Makros verwenden können und es keine Möglichkeit gibt, benutzerdefinierten VBA-Code innerhalb des Triggers auszuführen.
Wir haben auch einige Lösungen ausprobiert, bei denen Tastatureingaben direkt an das MS Access-Fenster gesendet wurden, um eine vom Benutzer aufgerufene Datenanforderung nachzuahmen. Das funktioniert, aber wir glauben nicht, dass dies eine realisierbare Lösung ist, die in der Produktion eingesetzt werden kann.
Wir haben uns auch mit DDE für MS Access befasst, aber wir konnten keine gute Musterlösung finden, die DDE-Befehle implementiert und diese für speicherinterne Daten und den Befehlsaustausch verwendet.
Das Hauptproblem besteht also darin, dass MS Access und die .Net-Anwendung gleichzeitig vorhanden sind und miteinander interagieren.
EDIT2 :
Ich habe vergessen zu erwähnen, welche MSMQ-Bibliothek wir auch in VBA für die Nachrichtenübermittlung zwischen .Net und MS Access implementiert haben. Das Problem war erneut das Fehlen eines Rückrufs hier: Wir mussten die Warteschlange wirklich nach neuen Nachrichten abfragen und da VBA nicht wirklich unterstützt Multithreading war keine wirklich gute Lösung.