将 Access 应用程序链接到 SQL Server - Azure SQL 数据库 (AccessToSQL)

如果希望搭配使用现有 Access 应用程序和 SQL Server,可将原始 Access 表链接到已迁移的 SQL Server 或 SQL Azure 表。 链接会修改 Access 数据库,以便查询、表单、报表和数据访问页使用 SQL Server 或 Azure SQL 数据库中的数据,而非 Access 数据库中的数据。

注意

Access 表会保留在 Access 中,但不会与 SQL Server 或 SQL Azure 的更新一起更新。 链接表并验证功能之后,可能要删除 Access 表。

链接 Access 和 SQL Server 表

将 Access 表链接到 SQL Server 或 SQL Azure 表时,Jet 数据库引擎会存储连接信息和表元数据,但数据存储在 SQL Server 或 SQL Azure 中。 此链接允许 Access 应用程序针对 Access 表进行操作,即使实际表和数据位于 SQL Server 或 SQL Azure 中。

注意

如果使用 SQL Server 身份验证,密码将存储在链接的 Access 表的明文中。 建议使用 Windows 身份验证。

链接表

  1. 在 Access 元数据资源管理器中,请选择要链接的表。

  2. 右键单击“表”,然后选择“链接”

SQL Server Migration Assistant (SSMA) for Access 会备份原始 Access 表并创建链接表。

链接表之后,SSMA 中的表会显示一个小链接图标。 在 Access 中,表显示有“链接”图标,该图标是一个地球,且有一个箭头指向它。

在 Access 中打开表时,将使用键集游标来检索数据。 因此,对于大型表,不会一次性检索所有数据。 但是,在浏览表时,Access 会视需要检索其他数据。

重要

若要链接 Access 表与 Azure 数据库,需要 SQL Server Native Client (SNAC) 10.5 或更高版本。
可以从 Microsoft SQL Server 2008 R2 功能包中获取最新版本的 SNAC。

取消链接 Access 表

从 SQL Server 或 SQL Azure 表取消链接 Access 表时,SSMA 将恢复原始 Access 表及其数据。

取消链接表

  1. 在 Access 元数据资源管理器中,请选择要取消链接的表。

  2. 右键单击“表”,然后选择“取消链接”

将表链接到其他服务器

如果已将 Access 表链接到一个 SQL Server 实例,且以后要更改指向另一个实例的链接,则必须重新链接这些表。

将表链接到其他服务器

  1. 在 Access 元数据资源管理器中,请选择要取消链接的表。

  2. 右键单击“表”,然后选择“取消链接”

  3. 单击“重新连接到 SQL Server”按钮。

  4. 连接到要与 Access 表链接的 SQL Server 或 SQL Azure 实例。

  5. 在 Access 元数据资源管理器中,请选择要链接的表。

  6. 右键单击“表”,然后选择“链接”

更新链接的表

如果 SQL Server 或 SQL Azure 表定义已更改,则可以使用本主题前面所述过程取消链接 SSMA 中的表,然后重新链接。 还可以使用 Access 来更新表。

使用 Access 更新链接的表

  1. 打开 Access 数据库。

  2. 在“对象”列表中,单击“表”。

  3. 右键单击链接表,然后选择“链接表管理器”。

  4. 选中要更新的每个链接表旁边的复选框,然后单击“确定”

迁移后可能会出现的问题

以下部分列出了将数据库从 Access 迁移到 SQL Server 或 SQL Azure,然后链接表后,现有 Access 应用程序中可能出现的问题,以及原因和解决方法。

链接表性能降低

原因:某些查询在调整大小后可能会变慢,原因如下:

  • 应用程序依赖于 SQL Server 或 SQL Azure 中不存在的函数,这会导致 Jet 在本地下拉表以运行 SELECT 查询。

  • 更新或删除许多行的查询由 Jet 作为每行的参数化查询发送。

解决方法:将运行缓慢的查询转换为传递查询、存储过程或视图。 转换为传递查询具有以下问题:

  • 无法修改传递查询。 必须以其他方式修改查询结果或添加新记录,例如,在绑定到查询的窗体上具有显式的“修改”或“添加”按钮。

  • 某些查询需要用户输入,但传递查询不支持用户输入。 可以通过提示输入参数的 Visual Basic for Applications (VBA) 代码或用作输入控件的窗体来获取用户输入。 在这两种情况下,VBA 代码会将具有用户输入的查询提交到服务器。

更新记录之前,不会更新自动递增列

原因:在 Jet 中调用 RecordSet.AddNew 后,自动递增列在更新记录之前可用。 在 SQL Server 或 SQL Azure 中,并非如此。 标识列的新值仅在保存新记录后可用。

解决方法:在访问标识字段之前,运行以下 Visual Basic for Applications (VBA) 代码:

Recordset.Update  
Recordset.Move 0,  
Recordset.LastModified  

新记录不可用

原因:使用 VBA 将记录添加到 SQL Server 或 SQL Azure 表时,如果表的唯一索引字段具有默认值,并且未向该字段赋值,则在 SQL Server 或 SQL Azure 中重新打开表之前,不会显示新记录。 如果尝试从新记录中获取值,将收到以下错误消息:

Run-time error '3167' Record is deleted.

解决方法:使用 VBA 代码打开 SQL Server 或 SQL Azure 表时,请包括 dbSeeChanges 选项,如以下示例所示:

Set rs = db.OpenRecordset("TestTable", dbOpenDynaset, dbSeeChanges)

迁移后,某些查询将不会允许用户添加新记录

原因:如果查询不包含唯一索引中包含的所有列,则无法使用查询来添加新值。

解决方法:确保至少一个唯一索引中包含的所有列都属于查询的一部分。

无法使用 Access 修改链接的表的架构

原因: 迁移数据和链接表后,用户无法在 Access 中修改表的架构。

解决方法:使用 SQL Server Management Studio 修改表架构,然后在 Access 中更新链接。

原因: 迁移数据后,列中的超链接会失去其功能,并变为简单 nvarchar(max) 列。

解决方法: 无。

Access 不支持某些 SQL Server 数据类型

原因:如果以后要更新 SQL Server 或 SQL Azure 表以包含 Access 不支持的数据类型,则无法在 Access 中打开该表。

解决方法:可以定义一个 Access 查询,它仅返回具有受支持数据类型的那些行。

另请参阅

将 Access 数据库迁移到 SQL Server