1

冒着引发 ODBC/OLEDB 争论的风险,有人对将 Access 前端链接到 SQL Server 后端有任何最佳实践建议吗?

我已阅读有关 .ADP 与 .MDB 的文章,并且还通过了无 DNS 连接信息并同意该想法。

我的主要问题是关于将数据和性能联系起来。过去,我发现直接连接到 SQL 数据库时表单很慢,我在“OnOpen”事件中测试了基于 ODBC 链接表与 OLEDB 连接的表单,发现 OLEDB 方法虽然不是很好,但速度更快。因此,我已经实现了在打开表单时在本地复制数据、修改、然后在完成时写回数据库的例程,但这有其自身的问题。

有没有人对这种设置的最佳实践方法有建议?我是否遗漏了一些可以改进直接链接到 SQL Server 的表单的内容?

任何意见或提示表示赞赏。

4

2 回答 2

2

您必须将网络流量减少到最低限度,尤其是确认交换。为此,请尽可能在 SQL 服务器上以独占方式运行 SQL,仅将完整的行集传输回客户端。不惜一切代价避免将服务器上的数据连接到 Access DB 中的数据。那应该让你开始。

于 2013-04-12T05:49:06.810 回答
2

基本方法是简单地使用链接表。

使用 ODBC 时,您应该不会在这里看到任何真正的区别。ODBC 是首选方法,Microsoft 已宣布结束对 oleDB 的支持(大约 10 年前,.net 社区离开了 oleDB 和 ADO)。

您可以将表单绑定到这些链接表并获得良好的性能。简单的技巧是减少和限制提取的记录。当您启动这些绑定表单时,可以通过使用 SIMPLE where 子句来完成此限制。

因此,如果您启动绑定的发票表单并在标准打开表单命令中提供 where 子句,那么只会提取一条记录。当然,如果您有一个绑定的子表单,那么也只会从服务器中提取正确的记录。因此,在 99% 的情况下,使用 oleDB 或 ADO 没有任何优势。

因此,作为一种通用开发方法,您可以在大多数情况下使用绑定表单。

需要注意的是,对于某些连接和任何具有聚合查询的内容,您希望将链接表用于 sql 视图。您还可以考虑对报告使用传递,但传递往往需要更多的工作,并且链接视图意味着您可以保留现有的 VBA 代码,这些代码可能(希望)使用“where”子句来打开这些报告并再次限制记录拉下网络管道。

对于执行服务器端命令的动态传递,我使用以下代码:

Dim qdfPass       As DAO.QueryDef 

Set qdfPass = CurrentDb.QueryDefs("MyPass") 
qdfPass.SQL = "exec sp_myProc " & "p1"
qdfPass.Execute  

如果您需要以上内容来返回记录,那么只需执行以下操作:

Dim qdfPass       As DAO.QueryDef 
Dim rstData       As DAO.recordSet
Set qdfPass = CurrentDb.QueryDefs("MyPass") 
qdfPass.SQL = "exec sp_myProc " & "p1"
set rstData = qdfPass.OpenRecordSet

因此,您可以使用很少的代码即时更改/修改上述 sql 以进行传递查询。归根结底,您因此获得了一流的性能,并且只需对现有应用程序进行极少的编码更改即可做到这一点。

所以这里目前推荐的方法是使用DAO。请记住,对于 oleDB(和 ADO)的 sql server 生命周期支持现已宣布。看这里:

http://blogs.msdn.com/b/sqlnativeclient/archive/2011/08/29/microsoft-is-aligning-with-odbc-for-native-relational-data-access.aspx

于 2013-04-13T02:26:06.723 回答