Access 连接 SQL Server:直通查询 vs 链接表 vs ADO,如何选择?

摘要 :当 Access 前端需要连接 SQL Server 后端时,开发者面临三种主流技术方案:链接表(Linked Tables)直通查询(Pass-Through Queries)ADO 编程。本文从底层原理、性能特征、适用场景三个维度进行深度对比,帮助开发者在实际项目中做出正确的技术选型。


一、技术背景

Access 作为前端开发工具连接 SQL Server 后端,是中小型企业信息化的经典架构。这种"胖客户端"模式相比纯 Web 方案,具有开发效率高、部署简单的优势。

但 Access 与 SQL Server 之间的数据交互存在多种实现路径,不同方案在 网络开销服务器负载代码复杂度 上差异显著。


二、三种方案的底层原理

1. 链接表(Linked Tables)

原理:通过 ODBC 驱动在 Access 中创建指向 SQL Server 表的"快捷方式"。Access 的 ACE/Jet 引擎会将用户操作(筛选、排序、更新)转换为 ODBC 调用。

复制代码
┌──────────────┐      ODBC       ┌──────────────┐
│   Access     │  ←──────────→   │  SQL Server  │
│  (ACE引擎)   │   链接表驱动     │   (T-SQL)    │
└──────────────┘                 └──────────────┘

技术特点

  • 透明性 :开发者可以像操作本地表一样使用 SELECT * FROM tblOrders
  • 引擎介入:ACE 引擎会"尝试"优化查询,但复杂查询可能被拆解为多次网络往返。
  • 事务支持:受限于 ODBC 驱动的事务隔离级别。

创建方式

vb 复制代码
' VBA 代码创建链接表
DoCmd.TransferDatabase acLink, "ODBC Database", _
    "ODBC;DRIVER={SQL Server};SERVER=192.168.1.100;DATABASE=SalesDB;Trusted_Connection=Yes", _
    acTable, "dbo.Orders", "lnkOrders"

2. 直通查询(Pass-Through Queries)

原理 :绕过 ACE 引擎,将 原生 T-SQL 直接发送到 SQL Server 执行,结果集作为只读快照返回。

复制代码
┌──────────────┐    原生 T-SQL    ┌──────────────┐
│   Access     │  ──────────────→ │  SQL Server  │
│  (仅传递)     │   不经过 ACE     │   (直接执行)  │
└──────────────┘                 └──────────────┘

技术特点

  • 完全控制 :可使用 SQL Server 特有语法(TOPWITH (NOLOCK)PIVOT 等)。
  • 只读限制:返回结果集默认不可编辑(除非配合链接表使用)。
  • 存储过程调用:最佳的存储过程执行方式。

创建方式

sql 复制代码
-- 在查询设计器中设置 "直通" 属性为 "是"
-- 或通过 VBA 创建
SELECT TOP 100 OrderID, CustomerName, OrderDate
FROM dbo.Orders WITH (NOLOCK)
WHERE OrderDate >= '2025-01-01'
ORDER BY OrderDate DESC

VBA 动态执行

vb 复制代码
Public Sub ExecutePassThrough(strSQL As String)
    Dim qdf As DAO.QueryDef
    
    On Error Resume Next
    CurrentDb.QueryDefs.Delete "qryTemp"
    On Error GoTo 0
    
    Set qdf = CurrentDb.CreateQueryDef("qryTemp")
    With qdf
        .Connect = "ODBC;DRIVER={SQL Server};SERVER=192.168.1.100;DATABASE=SalesDB;Trusted_Connection=Yes"
        .SQL = strSQL
        .ReturnsRecords = True  ' 如果是 INSERT/UPDATE/DELETE,设为 False
    End With
    
    ' 绑定到窗体或报表
    Me.RecordSource = "qryTemp"
End Sub

3. ADO 编程(ActiveX Data Objects)

原理 :通过 ADO 对象模型(ADODB.ConnectionADODB.Recordset)直接操作 OLE DB 或 ODBC 数据源,完全脱离 Access 的 DAO/ACE 体系。

复制代码
┌──────────────┐     OLE DB      ┌──────────────┐
│   Access     │  ←──────────→   │  SQL Server  │
│  (ADO对象)   │   直接连接       │   (T-SQL)    │
└──────────────┘                 └──────────────┘

技术特点

  • 最大灵活性:支持游标类型选择、批量更新、断开式记录集。
  • 可移植性:ADO 代码可直接迁移到 VB6、VBScript、Excel VBA。
  • 代码量大:需要手动管理连接生命周期和错误处理。

典型代码

vb 复制代码
Public Function GetOrders(strCustomerID As String) As ADODB.Recordset
    Dim conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim strSQL As String
    
    ' 连接字符串
    conn.ConnectionString = "Provider=SQLOLEDB;Data Source=192.168.1.100;" & _
                            "Initial Catalog=SalesDB;Integrated Security=SSPI;"
    conn.Open
    
    ' 参数化查询防止 SQL 注入
    strSQL = "SELECT * FROM dbo.Orders WHERE CustomerID = ?"
    
    With rs
        .ActiveConnection = conn
        .Source = strSQL
        .CursorLocation = adUseClient  ' 客户端游标,支持断开连接
        .CursorType = adOpenStatic
        .LockType = adLockBatchOptimistic
        .Open , , , , adCmdText
    End With
    
    ' 断开连接,返回独立记录集
    Set rs.ActiveConnection = Nothing
    conn.Close
    
    Set GetOrders = rs
End Function

三、性能对比测试

以下是在 万级数据量 下的典型场景测试结果(仅供参考,实际因网络环境而异):

场景 链接表 直通查询 ADO
SELECT 1000 条记录 1.2s 0.3s 0.4s
复杂 JOIN(5表关联) 8.5s 0.8s 0.9s
调用存储过程 不支持 0.2s 0.2s
批量 INSERT 1000 条 15s 0.5s 0.6s
单条记录更新 0.1s 0.1s 0.1s

结论

  • 简单 CRUD:三者差异不大。
  • 复杂查询/批量操作:直通查询和 ADO 优势明显。
  • 链接表的性能陷阱:多表 JOIN 时,ACE 引擎可能先拉取全表数据到本地再做关联,造成巨大的网络开销。

四、适用场景决策树

复制代码
                        ┌─────────────────────────┐
                        │  需要连接 SQL Server?   │
                        └───────────┬─────────────┘
                                    │
                    ┌───────────────┴───────────────┐
                    ▼                               ▼
            需要绑定窗体/报表?               仅需执行命令/获取数据?
                    │                               │
        ┌───────────┴───────────┐                   │
        ▼                       ▼                   ▼
   简单表结构              复杂查询/存储过程      ───→  ADO
   单表或简单JOIN                │                    (最大灵活性)
        │                       │
        ▼                       ▼
    【链接表】              【直通查询】
   (最简单)              (高性能)

场景建议

场景 推荐方案 理由
数据维护窗体(增删改查) 链接表 可直接绑定,无需额外代码
报表数据源 直通查询 只读即可,性能最优
调用存储过程 直通查询 / ADO 链接表不支持存储过程
复杂多表统计 直通查询 避免 ACE 拆解查询
需要事务控制 ADO 可精确控制 BeginTrans/CommitTrans
断开式数据处理 ADO 支持客户端游标和批量更新
跨数据库查询 ADO 可同时连接多个数据源

五、混合架构最佳实践

在实际项目中,三种方案往往需要混合使用

复制代码
┌─────────────────────────────────────────────────────────┐
│                    Access 前端                          │
├─────────────────────────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  │
│  │   链接表      │  │   直通查询   │  │    ADO      │  │
│  │ (数据维护)   │  │  (报表/统计) │  │  (存储过程)  │  │
│  └──────────────┘  └──────────────┘  └──────────────┘  │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
              ┌─────────────────────────┐
              │      SQL Server         │
              │   (存储过程/视图/表)     │
              └─────────────────────────┘

架构建议

  1. 基础表:使用链接表,方便窗体绑定。
  2. 复杂视图:在 SQL Server 端创建视图,Access 链接该视图。
  3. 统计报表:使用直通查询,发挥 SQL Server 的聚合能力。
  4. 业务逻辑:封装为存储过程,通过直通查询或 ADO 调用。

六、总结

维度 链接表 直通查询 ADO
学习成本 ★☆☆ ★★☆ ★★★
开发效率 ★★★ ★★☆ ★☆☆
运行性能 ★☆☆ ★★★ ★★★
灵活性 ★☆☆ ★★☆ ★★★
可维护性 ★★★ ★★☆ ★★☆

核心原则

  • 能用链接表解决的,不要过度设计。
  • 性能敏感的场景,优先考虑直通查询。
  • 需要精细控制(事务、游标、多数据源)时,使用 ADO。

「Access开发」 专注于 Microsoft Access 开发与企业级应用,提供以下服务:

📚 技术培训

  • Access VBA 从入门到精通(线上/线下)
  • Access + SQL Server 企业级开发实战
  • Access 系统性能优化与架构设计

💼 定制开发

  • 企业 ERP/CRM/进销存系统开发
  • 旧系统升级与性能优化
  • Access 迁移至 Web/Power Platform 咨询

🔧 技术支持

  • 代码审查与重构建议
  • 疑难问题远程诊断
  • 一对一技术辅导

技术改变业务,专注创造价值。

相关推荐
小魏每天都学习2 小时前
【sql-网络拓扑-子网划分-控制流图】
数据库·sql·mysql
HWL56792 小时前
Vue Router中,传递参数的几种方式
前端·javascript·vue.js
心态还需努力呀2 小时前
不止于 MongoDB 替代:金仓数据库多模一体的技术实践与性能实测
数据库·mongodb
Hgfdsaqwr2 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
米高梅狮子2 小时前
项目实战: LAMP-电商平台-iwebshop
前端·网络·chrome
qq_351754782 小时前
关于vue3切换空白页问题解决
开发语言·前端
2301_788662402 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
June bug2 小时前
【高频SQL基础版】查询
数据库·sql·面试·跳槽