将Ms Access应用程序转换为.Net应用程序有哪些好方法?

时间:2008-09-19 20:07:16

标签: ms-access legacy

我们有一个12岁的Ms Access应用程序,我们将其用于我们的核心库存仓库和发票系统。它已经在SQL Server后端运行,但所有“逻辑”,表单和报告都在Access中。在经历了大量的维护污泥之后,它将库存交易从非时间转变为时间,我意识到有一天我需要将这个事物转换成代码,这样我就可以在更易维护和可测试的环境中更好地管理逻辑。 / p>

有哪些技术可以让我以可管理和有效的方式将其转换为.Net应用程序?

一个想法是将查询转换为存储过程,然后将应用程序转换为Adp项目。但是我仍然对如何处理表单和报告毫无头绪。

此外,如果重要的话,我是我公司的唯一开发人员。

5 个答案:

答案 0 :(得分:6)

简短回答:迁移似乎不容易实现自动化。

我的猜测是你最好的选择是一次一个地重写(并安装)系统,即使(也许)它会强迫你的用户并排运行新版本和新版本一段时间使用不同的功能。您可以通过仔细考虑要迁移的功能和顺序来最小化这种麻烦。

例如,您可能有一个用户的工作角色要求他或她整天只使用一个屏幕。如果您首先使用附带的功能迁移该屏幕,则该用户可以立即在新系统上并保留旧系统,从而减少维护负担。

所以这些只是基于不太多信息的一些想法。无论如何,我希望这会有所帮助。

答案 1 :(得分:5)

由于您已经拥有一些具有某些业务逻辑的asp.net,您可以将其打开以作为Web服务(asmx文件)进行访问。 Google为您的访问版本(xp / 2003等)提供Microsoft Office Web Services Toolkit,这将为您编写vba代理类以便调用Web服务。您可以通过代码将Web服务数据绑定到表单(vba以读取和写入控件),或者使用来自Web服务的数据创建本地临时表并使用常规访问绑定。

根据您最熟悉的(code / tsql),您可以将逻辑放在存储过程或业务逻辑层或混合(两者)中。我发现测试代码比存储过程更容易,比如没有绑定到业务逻辑的sql server,即如果你想要更改数据库或想要在没有数据库的情况下离线开发/测试组件。 LINQ等新的.net功能具有相当好的性能,因此您不必依赖存储过程进行数据库活动。

保留访问前端用户界面,直到您重构了对Web服务的所有业务逻辑/数据访问权限。然后,您可以根据需要创建一个使用Web服务或winform应用程序的asp.net应用程序。 (暂时忽略wpf,作为一个ui,因为它是一个陡峭的学习曲线,并且还没有可以与访问数据表视图进行比较的数据网格。)

报告

访问报告可以升迁到sql server报告服务(报告中的vba不会升迁,最好在存储过程中编写一些tsql)。如果您没有完整的sql server产品,您仍然可以使用reportviewer控件在asp.net中编写报告(请参阅http://www.gotreportviewer.com/)(或使用标准版本或更高版本的Visual Studio的winform)绑定到ado .net数据集。

其他选项: 你可以编写.net dll并使用com interop。这种方法允许您逐步开始编写功能。不要使用.net ui,例如一个winform,因为它不会很好地访问ui。您可以编写业务逻辑或数据访问逻辑,然后从vba调用这些类。然后,如果需要,您可以将此代码移动到asp.net或Web服务。

要排除的事情:

我不喜欢用并排版本编写新应用程序的方法。作为一名开发人员,您有足够的担心。您可能最终会在两个版本中添加功能并调试两个版本而不是一个版本。

vb6表单互操作不适用于访问。

ADP如上所述已经死了。 (我从不喜欢它们,因为我经常使用本地表来优化性能,它们只能通过代码调用而不是链接)

您可以使用Visual Basic升级向导(在visual studio中)将vba模块和类模块转换为vb.net,但它不会升级所有内容(例如dao / ado代码到ado.net代码)和不会创建针对.net优化的代码,并且可能不容易编写单元测试,具体取决于vba代码的设计。我建议重写代码(如果您认真测试是否喜欢它,请尝试测试驱动开发。)

答案 2 :(得分:2)

我会考虑查看Interop Forms Toolkit。据我所知,这个工具可以很容易地在VB6中使用.NET表单,所以也许它也可以在Microsoft Access中使用?如果是这样,它可以帮助您以增量方式将应用程序迁移到.NET。快速搜索,我无法找到任何与Microsoft Access一起使用它的指南,所以如果结果是一条死胡同,我会道歉。

答案 3 :(得分:1)

从长远来看,转换为adp不是一个好的解决方案 - 微软放弃了这项技术。

如果你想切换到.net(为什么?你有理由支持.net吗?)我建议你开始阅读,尝试创建一些简单的应用程序,然后开始将这个数据库转换为应用程序的任务

但是...

我认为您和公司需要考虑该项目涉及的风险。如果你生病了会发生什么,就在管理层需要一些尚未存在的报告的那一周?我建议您寻找一家小型本地软件开发公司,他们将很乐意为您提供帮助。也许你可以安排你继续担任“首席开发人员”并且只将它们用于备份。

答案 4 :(得分:0)

我有一个类似的问题,并通过在Access前端中创建版本控制的部署系统(抓取并提取CAB文件)解决了这个问题,弄清了所需的AppDomain操作,以便能够将正确的CLR版本加载到Access中处理,加载.config文件并两种方式发布数据。

它使用标准的C DLL调用,因此不需要COM注册,但遗憾的是,也没有Unicode支持。

发送命令-通用,我可以使用此命令完成所有操作。 开放式表单-旨在替代DoCmd.OpenForm 打开报告-旨在替代DoCmd.OpenReport

因此,制作一个新报告,或将现有报告迁移到SSRS,使其成为标准格式,然后在Access中将DoCmd.OpenReport更改为netDoCmd.OpenReport。

遵循命名约定以了解要从何处加载报告,以及遵循标准方法提取报告所需的数据。

现在,我将在能力允许的情况下或请求更改时迁移一种形式或报告。

因为谁可以停止功能开发一年才能一举完成?

MDI不能正常工作。我认为围绕SetParent和UPDATE_UISTYLE我仍然需要做一些工作

所有这些使UI处于使用Access的进程和窗口中。我建立一切 在DLL中,最后一步将是创建一个加载“第一个表单”的EXE,并使用该EXE替换Access前端。