着种中间层称之为商业层。并非是正对每一个进行A(dd)D(elete)E(dit)。而是使用两层数据访问部件做到的。
1:数据访问层:这一层负责了对数据库的连接,包括内置了连接字串,GetRsBySQL,RunSQL,RunProc之类的比较低层的数据库操作。
2:商业层:这一层通过调用(1)来把商业规则封装起来。有时候做一个操作要涉及到许多表,而且商业规则经常变化。这个时候只要修改商业层就可以解决问题。
多层式的开发主要是把商业层和client分开,如果仅仅把数据库操作和client分开意义不大,如果商业规则发生变动所有的客户端程序都要升级,这就失去了多层的意义。

解决方案 »

  1.   

    bucher,你可不可以描述得明白一些呢?照你讲法,我应该怎么做好呢?
      

  2.   

    数据对象和数据表之间没有一一对应的关系。
    数据对象是按对象方式对数据进行组织。数据表是因为现在数据库系统的局限性(二维表)而无法实现面向对象,一张数据表在很多情况下无法完整地表达一个数据对象的所有属性。
    可能某数据对象的属性又对应于另一张数据表。数据对象划分的目的是为了封装,也是为了可重用。考虑数据对象的划分应主要从几个方面考虑:
    独立性:各数据对象包含的属性是否已准确完整地描述一个数据对象。
    偶合度:如果对数据对象的操作并无独立性,即操作对象A则必操作对象B,不单独存在针对数据对象A的重用性,则可把二对象合为一。
    复杂度:可分可合的数据对象则考虑其复杂度,分开有利于降低各对象难度,程序员比较容易集中精力解决主要问题。
      

  3.   

    to bucher,数据访问层仅仅作为客户端程序到数据库服务器的访问接口,在你的体系结构中缺少真正的数据对象层。你的数据库是对业务规则完全开发的,在团队开发中比较容易造成混乱,给了程序员比较多容易犯错的机会。这样处理首先需要处理业务逻辑的程序员对数据库结构熟悉(要不就只好把业务逻辑放在存储过程实现),更谈不上对数据对象的封装和重用。
      

  4.   

    看一下这张贴子:
    http://www.csdn.net/expert/Topic/62009.shtm
      

  5.   

    haor,62009帖子我看过了,其实我觉得你举的例子和我有相似,但其实你的做法也不过是上面的做法(1),那么如果现在你的项目有10个独立的表需要操作(就好象课程表),你会不会建立一个对各表通用的COM呢?(对不起,可能我还是不理解您的意思,原谅我的无知)
      

  6.   

    to kenken,如果你不明白我上面说的意思,最好有实在的例子便于分析。
      

  7.   

    to kenken,首先产生的不是表,而是数据对象。
    首先应该从应用的角度根据对象思路来分析系统中需要涉及的数据对象,再根据数据对象来设计数据表结构。所以我不会有你上面的烦恼。:-)
      

  8.   

    haor,你的EMAIL是什么,我把资料SEND给你,你看完就明白了,好不好?我把分数全给你啦。
      

  9.   

    [email protected]不过我只能明天再看了,不知道会不会耽误你哦,呵呵。
      

  10.   

    太感谢你,haor,我整理好以后SEND给你,希望你可以帮助我。最后问一个问题,如果只有几个数据表就好办,但是如果有几十个数据表,怎么能够准确地找出各个对象和各个对象的属性等等呢?
      

  11.   

    哎呀,糟糕,haor,我还是今晚想清楚了,明天再请教你吧,晚安,谢谢你,haor,你不愧为一个真正好的高手!
      

  12.   

    这里的理论很多,和我在书上看到的一样,不过小弟使用(1)和(2)的混合方法。特别提醒,更据本人个人最近的资料显示,组建开发最好使用c++, 并千万不要使用vb,因为他居然不支持多线程,我差点去投河,因为我以前的组件全部使用vb
      

  13.   

    haor说得对,我没有说清楚。
    商业层内部也是有划分的,包括基本的部件对象和基于这些部件所建立起的商业逻辑对象。
    你可以去学习一下UML,对于以后的编程会有帮助的。
    不同意july的看法,通过ActiveX技术VB支持多线程,多进程。幸亏你没跳河。
      

  14.   

    Where Can get VB7 ?
      

  15.   

    to bucher(bucher) :
    应当是我没有讲的明白.在COM+ service中,有线程和单元两个概念,其中单元的概念是这样的:一个单元是一个同步机制和COM对象的逻辑容器(container),从而提供一条线程的执行,能在一个进程中调用一个对象的方法.而COM_定义三种单元类型:
    单线程单元(Single-threaded Apartment)
    多线程单元(Multi-threaded Apartment)
    中立线程单元(Neutral-threaded Apartment)而VB目前仅仅支持单线程单元(Single-threaded Apartment),我没有用过VB7!
    同时VB应当已经对编程人员隐藏了线程的概念,如果老兄对这样很了解,请不吝赐教
      

  16.   

    to bucher(bucher) :
    应当是我没有讲的明白.在COM+ service中,有线程和单元两个概念,其中单元的概念是这样的:一个单元是一个同步机制和COM对象的逻辑容器(container),从而提供一条线程的执行,能在一个进程中调用一个对象的方法.而COM_定义三种单元类型:
    单线程单元(Single-threaded Apartment)
    多线程单元(Multi-threaded Apartment)
    中立线程单元(Neutral-threaded Apartment)而VB目前仅仅支持单线程单元(Single-threaded Apartment),我没有用过VB7!
    同时VB应当已经对编程人员隐藏了线程的概念,如果老兄对这样很了解,请不吝赐教
      

  17.   

    kenken:我不知道是否能帮你,我只把我的想法告诉你
    你可以用这种方法来解决你上面的问题:
      首先建立一个ActiveX控件,在这个控件中实现AddRecord、DeleteRecord、EditRecord、GetRecord方法,并且每一个方法都带一个标志参数,在这些方法中写上对表操作的共同部分,然后根据标志,利用withevents来产生相应的事件,然后再建一个ActiveX Dll ,将控件包一层,在这个动态连接库实现具体的操作(在事件中实现具体的操作),并且也可以注册到MTS(COM+)中,然后应用于WEB中,应该没有问题
    希望对你能有所帮助
      

  18.   

    To haor:我这几天要去出差,回来后再请教您,谢谢您以及各位大虾,令我明白了很多很多。希望您不要嫌弃我这个菜鸟,能够帮助我,毕竟小弟只是一个初出茅庐的小伙子,谢谢。
      

  19.   

    dll中建一个基类,只有接口,不包含实现.有多少个表,派生多少个子类.在子类中实现各方法.以上全为私有类.再定义一个公有类,管理你的子类,对外提供统一接口,OK?
      

  20.   

    to july:
    我自己开发了一套服务器部件连接缓冲系统,使用缓冲算法插件来实现缓冲算法的动态升级。不过目前我正在准备向COM+转移,如果COM+对VB支持不好我会考虑自己写其中的一部分。
      

  21.   

    TO bucher:
        给大家介绍一下你的系统构成,OK?
      

  22.   

    这个问题不至于吧 我想是这样的
    通用表的增加删除可以写几个AddRecord、DeleteRecord、EditRecord、GetRecord
    按照一种既定的规则来存取
    而具体的业务接口需要根据具体的需求来定制
    一个表一个数据对象? 头一次听说
      

  23.   

    to bucher(bucher):
    希望我们可以保持经常的交流,我也正在准备做您 现在做的 动动,也是因此才知道vb的缺陷的
      

  24.   

    对于MTS和COM+支持最好的是Delphi,如果利用VB的话,建议看一本
    Inside COM+ Base Services组件编程技术内幕。其中对COM+做了十分
    详细的说明,带范例,包括Vc++和VB和Java。另外好像kenken将的是
    实现基于Web的系统,现在大家好像只在讨论线程。
      

  25.   

    呵呵,在ASP上对组件的调用调试简直是!@#$!@!#!@$
    各位大虾,请讲讲这方面的经验
      

  26.   

    haor,在你的提醒和教导,经过继续看书,我已经完全明白啦,我觉得应该是这样的:对于首先建立每一个数据对象(每一个数据对象有各种属性和方法),然后多个数据对象封装成一个DLL;然后建立多个商业对象,这才是三层结构的核心--中间件!在每一个商业对象再调用各个数据对象,最后把多个商业对象封装成一个DLL;最后在表示层(ASP)中调用各个商业对象。HAOR,是这样吗?我想了很久了。
      

  27.   

    如果我想的是正确,我就给分了,各位高手,请留意小弟的另外两个关于DLL的问题,谢谢解答。
      

  28.   

    to TechnoFantasy():
    你说的那本书我这段时间正在看。
      

  29.   

    to haor,你最后的一句“再把该实例交由中间层处理”是什么意思?