如果您使用 SSMA(Access 的 Sql 迁移助手)进行迁移,那么您可以简单地重新运行保存的项目。
第一次运行 SSMA 时,会在 sql server 上创建数据表,然后传输数据。
但是,您可以再次打开同一个 SSMA 项目并重新运行它,您可以选择删除 SQL Server 上的数据,然后再次发送现有的 Access 数据。
SSMA 的“真正”强大功能之一是它可以让您重新发送数据。因此,您可以切片和切块,并多次尝试迁移。
一旦按照您想要的方式进行迁移,您就可以迁移数据。然后,您可以让您的前端与 sql server 一起工作。在此期间,毫无疑问,用户仍在使用旧系统(非 sql server)。
例如,SSMA 允许您向每个表添加一个 PK(如果它没有)。我经常发现“少数”表,例如用于驱动组合框等。没有(没有)该表的 PK 说驱动组合框。因此,在迁移过程中,您希望让 SSMA 为您创建 PK。您可以在迁移后手动执行此操作,但是您需要写下一些“作弊”笔记,因为正如您所指出的,您稍后将不得不再次进行迁移。
因此,如果您对数据结构进行任何“手动”更改,那么您希望在再次迁移时“保存”这些更改。这样做的美妙之处在于,当您在表设计模式(sql server)中时,您可以右键单击,然后选择“脚本”更改。因此,如果您对每个表进行 10 次或更多更改,则可以将更改保存到 sql 脚本中。所以现在您可以迁移,然后运行这些脚本。
现在,在迁移之后,您可以开始让这个前端与 SQL Server 一起工作。在此期间,毫无疑问,用户仍在使用旧系统(访问后端)。
一旦您的新前端在 sql server 上运行良好,您就可以选择一天进行新的推出。您下班后或在停机期间,重新运行您保存的 SSMA 项目。结果是现在 SQL Server 拥有最新的数据。然后,您现在可以推出和部署链接到 SQL Server 的新前端。
如上所述,虽然 SSMA 可以迁移 Access 查询,但我强烈建议您不要这样做。只需迁移数据,并将前端表链接到 sql server。此时,您的 Access 应用程序的 99% 将像以前一样工作。您“可能”必须更改 VBA 打开记录集命令(将 dbOpenDynaset 和 dbSeeChagees 添加到该 openRecordSet 命令(但这是全局搜索和替换 - 根本不需要太多时间)。
所以你可能有很多这样的代码:
Set rst = CurrentDb.OpenRecordset(strSQL)
你需要将上面的内容改为:
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbSeeChanges)
因此,以上内容将允许 99% 的 VBA reocrdset 代码像以前一样工作而无需更改。
唯一的“共同点”是使用 Access 后端,当您弄脏表单或弄脏(也添加)记录时,会立即生成自动编号 ID。这允许代码立即获取自动编号 PK。
所以像这样的旧代码:
Set rstRecords = CurrentDb.OpenRecordset("tblmain")
rstRecords.AddNew
' lots of some "code" here follows
lngPK = rst!ID
在上面,请注意我的 VBA 代码如何获取 PK 自动编号。
在 sql server 中,在强制保存记录之前,您无法获取该 PK。而且 DAO 有一个非常讨厌的问题是,在您发布更新后(仅在添加期间 - 我在仅添加记录期间重复!!!),然后记录指针会跳出当前记录。当您使用 DAO 记录集更新现有记录时,不会发生这种情况(同样:仅适用于新的记录)。
所以,上面的代码现在变成了:
Set rstRecords = CurrentDb.OpenRecordset("tblmain")
rstRecords.AddNew
' code can go here to add data, or set values to the reocord
rstRecords.Update
rstRecords.Bookmark = rstRecords.LastModified
lngNext = rstRecords!ID
rstRecords.Close
因此,对于立即获取自动编号 PK 的代码,我们必须做两件事:
强制记录写入(更新)
然后在更新之后,重新定位记录指针。 (您只需要在添加时重新发布 - 而不是编辑,但无论如何我经常这样做)。这个重新定位问题可能是我使用 DAO 的最大痛苦(ADO 不需要重新定位)。
因此,您的代码在该 reocrdset 中添加/设置字段等不必更改。因此,请保留该代码之前所做的任何事情。
现在发布更新,然后获取自动编号 PK。
所以上面应该涵盖了您必须更改的 99% 的 VBA 代码。即使在一个相当大的项目中,上述问题也只会在少数地方发生。 (我发现我可以在代码库中搜索“.add”,并且可以在发出“.update”命令之前快速确定代码是否正在抓取自动编号PK。
表单也是如此。当用户开始输入时,表单变得“脏”。使用Access后端,可以通过代码获取自动编号PK,但是使用sql server后端,您必须在表单中发出记录保存,然后获取PK ID。
所以,你添加这一行:
If me.Dirty = True then me.Dirty = false
lngID = me!id
所以你添加了一行来强制保存记录(me.Dirty = false)。
我再次发现,即使有 150 个表单,也只有 1 或 2 个会在表单记录保存之前“抓取”PK id。因此,对于两种表单和 VBA reocordset 代码,都将出现无法为新记录抓取的自动编号的“缺乏”。很少有表格会获取 PK 自动编号 ID,但有些表格确实需要这个(比如添加子记录)。但是,现有表单+子表单没有这个问题,因为当焦点从主表单跳转到任何子表单时,访问总是会发出记录保存。
不管怎样,一旦你让新的前端工作(当然还有一个使用与以前相同的表名链接前端)。
如果我记得,SSMA 倾向于将“dbo”放在 Access 表链接名称的前面——你不希望这样。 sql server 端的 dbo 模式是默认的,同样不会造成任何问题或问题。
是的,SSMA 允许您重新运行迁移,并允许您在重新迁移期间删除 SQL Server 上的数据。您不需要删除旧数据,SSMA 可以为您完成。