设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 6185|回复: 12
打印 上一主题 下一主题

用ADP的高手们,是绑定表还是使用SQL语句处理窗体?

[复制链接]
跳转到指定楼层
1#
发表于 2015-2-28 23:30:39 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lwwvb 于 2015-3-1 00:23 编辑

今天看到一个快速开发ACCESS的平台,说里面自动生成的窗体是非绑定表的。原因是使用绑定表,并发用户数多了,数据量大了会慢。

但是,造成这个慢的原因,道理也许是:
原因一:可能后台使用ACCESS 数据库。
原因二:DAO方式,而且使用ODBC接口,造成性能不佳。
原因三:设计不合理。

但如果我们使用ADP,多用户时,后台选用SQL SERVER,ADP一定是使用ADO的,再加上合理的设计。

在多用户并发,多数据时,会不会慢呢?比ODBC+MDB的方式好多少?
只因没有做过这样的多用户的工程,不能了解其中。
有经验的朋友可以讨论一下,用ADP时,你们使用绑定表,还是非绑定表?如果用户并发不是非常多的情况下,是否绑定表还是首选?

补充一下:后台同样是SQL 2008中,使用SQL SERVER PRO PROFILER监视,设计一个简单的主从表窗体。使用MDB+ODBC 方式中,打开主从窗体,看到SQL 2008要花下面SQL指令。
exec sp_unprepare 3
go
exec sp_unprepare 4
go
SELECT "dbo"."学生"."学号" FROM "dbo"."学生"
go
declare @p1 int
set @p1=5
exec sp_prepexec @p1 output,N'@P1 nvarchar(50)',N'SELECT "学号","姓名","年龄"  FROM "dbo"."学生"  WHERE "学号" = @P1',N'C2'
select @p1
go
exec sp_execute 5,N'C2'
go
select 504,c.name,c.description,c.definition from master.dbo.syscharsets c where c.id = convert(tinyint, databasepropertyex ( db_name() , 'sqlcharset'))
go
exec sp_executesql N'SELECT "窗体2"."ID" FROM "dbo"."成绩" "窗体2" WHERE ( @P1 = "学号" ) ',N'@P1 varchar(510)','C2'
go
exec sp_execute 5,N'C2'
go
declare @p1 int
set @p1=6
exec sp_prepexec @p1 output,N'@P1 nvarchar(50),@P2 nvarchar(50),@P3 nvarchar(50),@P4 nvarchar(50),@P5 nvarchar(50),@P6 nvarchar(50),@P7 nvarchar(50),@P8 nvarchar(50),@P9 nvarchar(50),@P10 nvarchar(50)',N'SELECT "学号","姓名","年龄"  FROM "dbo"."学生"  WHERE "学号" = @P1 OR "学号" = @P2 OR "学号" = @P3 OR "学号" = @P4 OR "学号" = @P5 OR "学号" = @P6 OR "学号" = @P7 OR "学号" = @P8 OR "学号" = @P9 OR "学号" = @P10',N'C1',N'C3',N'C3',N'C3',N'C3',N'C3',N'C3',N'C3',N'C3',N'C3'
select @p1
go


同一个条件,使用ADP,打开主从窗体要花下面SQL指令。


SET ROWCOUNT 10000
go
SELECT * FROM "dbo"."学生"
go
SET ROWCOUNT 0
go
SET FMTONLY ON select "学号" from  "dbo"."成绩" WHERE 1=2  SET FMTONLY OFFdeclare @p1 int
set @p1=1
exec sp_prepare @p1 output,N'@P1 nvarchar(50)',N'SELECT  *  FROM "dbo"."成绩" WHERE ((@P1 = "学号"))',1
select @p1
go
SET ROWCOUNT 10000
goexec sp_executesql N'SELECT  *  FROM "dbo"."成绩" WHERE ((@P1 = "学号"))',N'@P1 nvarchar(2)',N'C2'
go
SET ROWCOUNT 0

go
EXEC sp_MShelpcolumns N'成绩', NULL, N'id', 1
go


看来,ODBC和ADP效率差很远。。。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2015-3-1 17:13:11 | 显示全部楼层
本帖最后由 lwwvb 于 2015-3-1 17:44 编辑

先为楼上发言鼓掌。感谢为我提供了一些思路。我也说一下升级ADP的理由,MDB的后台最终只适合单机单人用。局域网以上的应用,SQL SERVER才是王道。但SQL SERVER可以使用MDB+ODBC或ADP开发。为什么很多高手和商业软件坚持使用MDB+ODBC?我认为两点:
1.这是因为用ADP的话,要重新学习,代码要改写,造成负担,一些思维方式与MDB不同(因为数据与前台分离了)。为了避免麻烦,最好是不管它了。
2.MS在2013版后把ADP取消了。ADP最多用到2010版本。

而关于用绑定表还是非绑定,经过楼上的分析,这个慢的问题,一是程序员设计上的问题,二是不会使用软件中某些选项造成的性能问题。

我也赞同能简单就简单。如果不是到万不得已,最好还是使用绑定方式,免得为自己添麻烦。在ADO.NET上,数据集和数据链接已经分离,使用绑定绝不会有性能问题。

而快速开发平台生成窗体使用非绑定表,也许可能ODBC当时没有现在的那么先进?或也许是为了考虑适应各种开发者的水平和用户数量,而设计的一个方案?


但为什么我还是会对绑定表的使用有所担心,这是因为用户并发数非常多的时候,对服务器会是一个负担,ADO.NET采用断开式也是原因之一。而我只是想弄清这个极限在哪?但现在看来,不需要担心,放心用绑定表就是。


补充一下:我还是会继续用ADP来做SQL SERVER 的开发,理由是ADP比MDB+ODBC的分层要好(强制不能把VBA混在查询中)。这和其它开发工具的二层开发很接近。
如果用MDB+ODBC,开发中很容易使用MDB的思维,把VBA和查询/数据集混在一起用。这样,未处理好的数据有机会都会提取到客户端,会造成性能问题。
现代的数据库开发,都是向三层和多层发展的。ADP虽然中止在2010版本上,但并不代表ADP不好。相反,ADP是我们更进一步的基石。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-12 17:26 , Processed in 0.107066 second(s), 25 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表