我们有一个非常庞大的MS Access应用程序,最初是为满足我们的个人需求而开发的,后来变成了商业软件并成功销售。该软件是一种“为您的企业而设计的全方位软件”,包含文档管理系统,企业资源计划,库存管理,客户关系管理,数据分析等多个模块。我们对当前的情况非常满意应用程序的功能,但是为了满足客户的要求,我们意识到我们必须转向新的事物。
我们决定逐渐将应用程序移至.Net,因为我们可以坚持使用Visual Basic .Net:尽管它是此处大多数开发人员的新语言,但我们对VBA以及在VB6中实现的数十个小型项目都有很深的了解。
我们已经开始将应用程序的数据层功能移至MS SQL Server,以便每个数据操作和搜索都直接在服务器上执行。
我们正在寻找的是逐步移动我们广泛的GUI的最佳实践(大约500-600种不同形式,包括子表单,大约200种具有多语言支持的报告等)。潜在客户最近要求在DMS中对文档实施异步数据加密之后,我们也很乐意将这部分与MS Access完全脱钩,并在.Net中进行实现。
问题是如何将.Net应用程序与现有的MS Access系统无缝集成,以便我们可以使用某些参数(用户权限等)调用它,并启用此应用程序与正在运行的MS Access应用程序之间的数据交换。
编辑:
我们试图应用Martin Fowler的“ 企业集成模式 ” 一书中的一些实践,以实现MS Access应用程序与我们为各种需求在.Net中实现的一些小型实用程序之间的集成。但是我们仅设法使用“共享数据库”模式,对我们的解决方案并不满意。
例如,我们实现了一个作为Windows服务运行的小型实用程序,该实用程序使用POP3连接自动从邮件服务器下载所有邮件并将它们存储到一个表中,而所有附件都存储在文件系统中。
我们主要要做的是使用ADO.NET直接访问MDB格式的MS Access数据库,并用一些处理过的数据填充表格(例如上例中有关邮件消息的数据:我们有FROM,TO,CC,BCC,主题和身体)。
使用.Net的MDB数据格式绝对没有问题,此外,我们不想再使用MDB并将几乎所有内容升级到MS SQL Server 2008了-这给了我们更多关于数据管理和可伸缩性的自由。
这里的主要问题是我们不知道如何在Access中实现某种“回调”,以便我们可以在数据更新时触发某些VBA代码的执行。
MS Access 2010支持对数据表的更新和插入触发器,我们寄予了厚望,但事实证明,我们只能对这些触发器使用MS Access宏,并且无法在触发器内执行任何自定义VBA代码。
我们还尝试了一些解决方案,将击键直接发送到MS Access窗口,以模仿某些用户调用的数据重新查询。这可行,但是我们认为这不是可以在生产中使用的可行解决方案。
我们还研究了用于MS Access的DDE,但找不到实现DDE命令并将其用于内存数据和命令交换的良好示例解决方案。
因此,主要问题是使MS Access和.Net应用程序共存并相互交互。
编辑2:
我忘了提一下我们在VBA中也实现了MSMQ库,以便在.Net和MS Access之间传递消息,问题再次出在这里,缺少回调:我们真的不得不在队列中轮询新消息,并且鉴于VBA并不真正支持多线程,这并不是一个很好的解决方案。