Modernize Studio
语言:简体中文
发邮件给我们

案例研究:微软 Northwind 数据库,从 Access 97 迁移到 SQL 和浏览器

Northwind 是微软随 Access 附带的示例数据库。我们使用它的一份公开副本(Access 97 格式),在一个任何人都能核查的文件上展示:我们如何把 Access 程序迁移到现代数据库,一行不丢,一个数字不变。这个页面背后没有客户,Northwind 中的公司和人物都是虚构的。

Northwind 网页应用:订单 10250 处于编辑状态,包含三条产品明细、折扣和实时更新的合计。
基于迁移后数据库构建的网页应用:微软 Northwind 示例数据库中的一个订单,合计会随着输入实时重新计算。

起点

  • 一个 2,932 KB 的 Access 97 文件:9 张表共 4,032 行,22 个已保存查询(其中三个带参数,一个是交叉表),13 个报表和 21 个窗体。
  • 以 OLE 对象存储的图片,只有 Access 能显示。
  • 业务规则分散在字段属性、关系以及报表背后的查询中。

我们做了什么

  1. 数据。所有表和所有行都迁移到新的关系模式,以 SQLite 数据库和 PostgreSQL 脚本两种形式交付,包含主键、外键和索引,Access 的有效性规则也转为数据库约束。17 张图片逐像素转换为 PNG 文件。
  2. 查询。22 个已保存查询在两个数据库中都变成同名的 SQL 视图,报表所用的计算也一并迁移:折后订单合计、发票金额、按类别和年份统计的销售额。
  3. 验证。自动化测试把原始文件与新数据库进行比对:每张表的行数和每一行的校验和,以及每个查询的完整结果,共运行 855 次,并用四种方式核对(在原始文件上运行 Access SQL、一个独立模型、PostgreSQL 和浏览器)。
  4. 应用。基于迁移后数据库的网页应用,完全在浏览器中运行:订单及实时合计、客户、产品、供应商、员工、仪表板,以及可打印的原始报表。

运行结果

9/9
表格逐行一致
22/22
查询结果一致(运行 855 次)
17/17
违反规则的尝试被数据库拒绝
$1,265,793.02
2,155 条订单明细的总值,在 SQLite、PostgreSQL 和浏览器中完全相同

两处差异,均为有意为之

Access 用二进制浮点数计算订单明细,并以近似值保存折扣(15% 存为 0.15000000596)。在 2,155 条订单明细中,有 18 条的精确金额恰好落在半分上,结果因此相差一分。新数据库保存精确的百分比,并在所有地方以相同方式舍入;总计变化 $0.16。所有受影响的明细都列在报告中。

148 个文本值去掉了末尾多余的空格或旧式换行符。其中一个是国家名 Sweden,有一次在末尾多存了一个空格,否则会被算作另一个国家。

测试过程中的发现

UCanAccess 是一款从 Java 读取 Access 文件的常用工具,它把这个 Access 97 文件中的折扣列读成整数,导致 838 个折扣全部变成零。表格核对发现了这个问题,报告中说明了我们如何做到同口径比对。Jackcess 重建的 SQL 文本还漏掉了某个查询的 TOP 10,我们从文件的系统表中读取了它。

该应用使用编译为 WebAssembly 的 SQLite,把 1,116 KB 的数据库加载到您的浏览器中。修改只保留在当前标签页,点击按钮即可恢复原始数据。

联系我们

请选择您方便的联系方式。我们会在一个工作日内用中文通过电子邮件回复您。

通过邮件

riccardo@modernizestudio.com
写邮件

如果您有一个 Access 数据库或其他旧程序,希望走一遍同样的流程,请发给我们一份副本或一段简短描述。我们会在一个工作日内回复。

把文件发给我们

如果程序是用 Access、Excel、VB6、Delphi 或早期 .NET 开发的,您在发送文件后 48 小时内即可收到一份免费的书面评估。

  1. 复制一份文件,如您愿意,可使用测试数据。
  2. 把它附在表单或邮件中,最好放进有密码保护的压缩包,并另行发送密码。如有需要,我们会先签署保密协议。
  3. 48 小时内:收到评估报告和试点模块的固定价格。

我们在意大利办公。

给我们留言

可选。数据库、Excel 工作簿、截图或需求说明,最大 10 MB。更大的文件请在留言中附上下载链接。

发邮件给我们

点击按钮会打开您的邮件程序并填好内容。只有在邮件程序中点击“发送”后才会真正发出。

发邮件给我们