解决方法
>如果您使用ADP作为sql Server的前端,则不会使用DAO,因为您不能,因为ADP不使用Jet / ACE.然后,您将与sql Server建立直接ADO连接.
>但是,在过去5年左右的时间里,MS一直在使用ODBC弃用ADP而支持MDB / ACCDB(某些报告方案除外). A2007和A2010中的ADP没有变化,这可能表明MS正计划完全放弃它们(正如他们在A2002和A2003没有变化后对DAP所做的那样).但也可能是MS计划在下一版本的Access中恢复ADP,因为Access团队一直在积极寻求使用sql Server的人的输入.
>使用推荐的技术(MDB / ACCDB)和ODBC(以及可能是链接表),您使用的是Jet / ACE,逻辑数据接口是DAO,Jet / ACE的本机数据接口.
Jet / ACE在处理服务器数据库方面实际上非常聪明,但它确实会出错,而且某些类型的查询缺乏经验,Access开发人员可能会编写带有服务器数据库的性能猪(因为他们强制使用Jet / ACE)从服务器拉出整个表并在客户端工作站上完成所有工作 – 请参阅上面的@Philippe Grondier的答案.
从MDB / ACCDB通过ODBC使用sql Server的常用方法是尝试使用绑定表单和整个九码的Access方式(没有什么不同,如果你设计的应用程序用于Jet / ACE后端),然后使用sql事件探查器确定哪些部分是性能瓶颈,应该重新构建,以便在服务器端进行适当的处理.
明智地使用ADO通常是有道理的,因为ADO在某些方面做得非常出色,DAO表现不佳或根本没有.
但基本思路是使用与Jet / ACE后端相同的方法,因为Jet / ACE正在管理与服务器的接口.这意味着您不必担心Jet / ACE的sql方言与服务器数据库方言之间的差异,因为Jet / ACE和ODBC完全消除了这些差异.
一些随机问题:
>对于DAO记录集,您需要添加dbSeeChanges选项.>所有表都有主键至关重要,否则您可能会有奇怪的屏幕更新.但你们所有的桌子都有PK,对吧?>我发现在sql Server的所有表中放置一个时间戳字段是可取的,即使我从未明确使用它.这(与#2结合使用)确保刷新尽可能高效(ODBC可以检查时间戳,而不是需要将所有客户端字段逐个与服务器端值进行比较).>如果你使用passthrough查询或ODBCDirect,你需要担心服务器数据库的sql方言,并保持Jet / ACE正在处理哪个sql(并将其解释为后端方言),哪个直接进行到服务器.> Jet / ACE没有与bigint对应的数据类型,因此如果在sql Server表中将其用作PK,则需要以非标准方式处理它. MS知识库中有关于解决此问题的文章.>如果您使用ADO,请记住ADO使用Access调用的“sql 92兼容模式”,这意味着sql Server通配符和派生表语法.