众位高手,小弟问一个小问题,是现在讨论的非常多的有关数据逻辑和界面部分完全分离的一个问题!(18分)

  • 主题发起人 Spring_Thunder
  • 开始时间
S

Spring_Thunder

Unregistered / Unconfirmed
GUEST, unregistred user!
众位高手,小弟问一个小问题,是现在讨论的非常多的有关数据逻辑和界面部分
完全分离的一个问题!
现在看一下,在大富翁里面这类的问题非常的多,好像是很时髦,可是我想问的
是如果这样以后,数据集以什么样的方式来返回呢?
我看到有人是这样做的,将查询出来的结果集以TDataSet的形式返回,可是这样
的话,用户界面部分不是同样用到DB了吗?要用TDataSet必需引用DB,这是不是
说数据逻辑与界面部分并没有完全分离呢?

还望高手帮忙解释一下!
 
我看到一些软件也是这样,说是维护方便,连增加删除甚至连修改也是用存储过程实现,
在前台也就是界面端,根本也不用什么数据控件,只是用一个通用的执行存储过程的
函数返回一结果集,然后读到stringGrid中.如果这样要增加非常多的代码而且
由于没有用到绑定技术
1.如果是数字形的,所以在后台即逻辑层要检测;
2.如果输入长度大于字段宽度,在后台要检测;
3.日期形的也是如此;
4.当前的数据是处于什么状态,也不得而知,所以在退出是,询问是否要保存,也不好做到;
5.删除记录也很不方便;
6.排序很不方便;
7.如果是字段多的话,在增加或修改时就要写在后台写一大堆代码,而且也经常错位;
8.如果是主从表,就更不用了说了;
............
其实DELPHI的绑定技术是比较成熟的,不象VB(我用过一年多的VB);
面优点我目前为止就只发现
1.维护量是小了点,如要修改就只要在后台修改一下就可以,客户端基本可不动,
对于客户端多的确实可以省去很多麻烦,但问题是如果要增加一个字段,
客户端不是同样要修改吗(如果在产品没有很成熟的阶段,这是经常做的事:)
2.开发时,只要把前端程序框架写好,就可以不管了,只要在后写SQL代码就可以了,
似乎有点新鲜感.
注: 以上所有的后台即是逻辑层,前台就是界面,也主要是针对SQL server来说的
只是本人的一点小见,也在困域中....
 
2002-09-15 13:19:22 幽燕游侠
在3层中,客户端没有使用任何SQL查询,中间层使用存储过程做查询,
要向客户端回传存储过程的查询的数据,怎么做啊?
-----
少量的数据,我用数组可以传递,但是select到那么多的数据,
客户端该怎么显示呢? 这个问题我解决不了 :(

2002-09-15 13:12:22 billrobin
存储过程没有办法。我一般是用变体数组直接通过接口传回客户端了。
您看一下他的TLB文件。

2002-09-15 13:25:58 幽燕游侠
是的
我也是用
VarArrayCreate([0,i],varVariant); 这样的变体数组回传的。
但是数据量大的时候网络能承受的了吗?

另, 不用存储过程的话,如何回传给客户端呢???
论坛上有这样的帖子吗?

2002-09-15 13:19:10 billrobin
您传回来干什么?
您就在中间层把业务处理了就是了。我从头到开发了一套软件,很少再传回来。客户端只需要结果。所以我现在在处理线程的问题了。处理完了。
基本上很完善的。

2002-09-15 13:32:39 幽燕游侠
那客户端 操作界面的查询 修改操作怎么处理呢?

我所想象的数据的流程是这样的:

客户端查询-->> 中间层处理:从数据库提取符合条件的记录--
|
|
客户端显示<<----- 中间层回传给客户端 <<------------
^^^^^^^^^^^^^^^^^^^^^^^^^ 问题所在!!!!
有哪里不对吗? 请教了。 多谢。

2002-09-15 13:24:30 billrobin
您可以用clientdata的commandtext。
您试一下,向中间层发一个sql。它肯定就将结果给您了。

2002-09-15 13:41:14 幽燕游侠
以前的我就是用clientdata的commandtext。
后来我在论坛上看说这是“伪三层”:中间用DataSetProvider链接query
----------
他们说中间层只需要Query 或 DataSet,

而客户端只需要 一个DCOMConnection 或 SocketConnection 就行了。

用的时候就SocketConnection1.AppServer.XXX 就可以了。
----------
我现在正迷茫呢。。。 盼您指导。

2002-09-15 13:32:41 billrobin
您还可以......我拷程序给您。等一下。
--------------------后来就没有了下文。后来我用clientdata的commandtext。
 
我觉得答案是:根本不需要返回大数据集。许多人喜欢在form上放一个grid,把几百条的
记录在里面显示出来。但实际上,有多少个用户会真正去看grid里面的内容?一个设计良
好的界面应该只显示最相关的信息。如果需要浏览性质的界面,可以参考网页的做法,一次
显示10条或20条记录。其实多数情况下,只要告诉用户“你的查询找到了500多条记录,头10
条如下。。。。”,用户最多也就是看一看头三条就去重新设定查询条件了。至于处理报表
打印,效率问题就不明显了,完全可以逐条返回。

而关于向界面返回TDataSet,最大的问题是字段名相关。但字段名相关问题是很好解决的,
一来字段名一般不会变动(如果没做好数据库规划就可以编写的程序,也不会复杂到要用太
多的分离策略了);二来即使变动了,运行一下程序就可以发现所有的错误,或者可以在SQL
中把字段名改过来就行了(前提是你的更新是使用update提交的。别忘了,这时你的sql都
集中在管理数据库的对象中,修改sql很方便)。

to jrq
在界面层的确不适应直接提交SQL的,否则中间层就仅仅起到一个中转站的功能。中间层向
界面层提高的服务应该是面向业务的。例如界面需要所有工资大于一定数目的人,中间层就
应该提供一个方法FindSalaryHigher(salary : real) as TDataSet的方法,界面调用这个方
法,SQL写在中间层里。
 
看来我的有点离题了,我那是针对两层的
 
呵呵,这是没关系的。三层的思想可以用在两层中的。
我正在翻译一篇关于分层的文章,第一部分放在
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=946305 了,你可以去看看
 
kidneyball 老兄:

多谢老兄的指点。

少量的查询返回或不返回结果集的,我是按照老兄所说的,调用了中间层的方法,在中间层写的SQL。
但是比较头疼的是:用户操作端要用DBGrid显示大量数据,这样该怎么办?

比如用户资料的修改:
张三(id 为001)的资料输入有误,但事先并不知道张三的资料存在错误(即不知道id=001的记录有误)。
这样,要审核资料时就要通过中间层(注意:我没有通过中间层,我是用的commandtext)给用户端
返回所有用户的资料(或返回指定数量,如100条),
这时客户端审核,发现id=001的有误。这样根据id=001再进行其他操作处理(删、改等,可在调用中间层方法处理)。

我是想找一个办法来解决上述问题(就是中间层给用户端返回的资料的问题)。

我不知道我的描述正确吗?我对三层的概念理解还不够深刻,欠缺的地方请多多帮助和指教。 谢谢。
 
多人接受答案了。
 
顶部