冒着启动ODBC / OLEDB争论的风险,是否有人有任何关于将访问前端链接到SQL Server后端的最佳实践建议?
我已经阅读了有关.ADP vs .MDB的文章,并且还通过无DNS连接信息并同意这一想法。
我的主要问题是关于数据和性能的链接。在过去,我发现在直接连接到SQL数据库时表单速度很慢,我在“OnOpen”事件中测试了基于ODBC链接表的表单和OLEDB连接,发现OLEDB方法虽然不是很好但更快。因此,我已经实现了在打开表单时修改数据然后在本地复制数据的例程,然后在完成时写回数据库,但这有其自身的问题。
有没有人对这种设置的最佳实践方法有什么建议?我是否遗漏了一些可以改进直接链接到SQL Server的表单的内容?
任何评论或提示都表示赞赏。
答案 0 :(得分:2)
您必须将网络流量降至最低,尤其是确认交换。通过尽可能在SQL服务器上独占运行SQL来执行此操作,仅将完整的行集传输回客户端。不惜一切代价避免将服务器上的数据加入Access DB中的数据。这应该让你开始。
答案 1 :(得分:2)
基本方法是简单地使用链接表。
使用ODBC时,您不应该看到任何真正的区别。 ODBC是首选方法,微软已经宣布结束了对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。并且请记住,现在已宣布针对sql server的oleDB(和ADO)的生命终止支持。见这里: