有一个数据库应用三层结构项目,界面用VB,Delphi开发,应用层在VC下用COM技术开发,现在我想在VC下从数据库中取得的大量数据传会给调用者,比方个人信息包括姓名(字符串),性别(整型)等等,要求应用层改动后,界面层可以很少改动,甚至不用改动,更甚至不用重新编译,怎么实现。VC,VB,DELPHI开发的时候分别要注意什么。重在参与,顶者10分,总量3000,送完为止。

解决方案 »

  1.   

    delphi对多层的的支持几乎是完美的,从早先的MIDAS到现在的Snap技术,你不需要用VC写,这样反而会因为同时用几种开发工具而增加复杂度.
    我用BCB的MIDAS技术写过基于DCOM的三层,我觉得多层数据库系统是delphi和BCB的强项,底层不需要用VC.
      

  2.   

    如果你想前台尽量不改动,则在设计COM接口时要尽量多考虑一点。只要接口不变,接口的内容变了前台是不用改动的。如果一次要返回多个结果,如结构数组,则还可以考虑一下用记录集的形式代替结构。
      

  3.   

    传递大量参数也可以用Variant数组.
      

  4.   

    对于所要传递的数据,建议都建立一个组件COM,例如学生信息,就建立一个有关学生信息的COM,例如叫MyCompoent.Student.这样当需要COM和调用者(例如ASP或可能也是一个COM)相互传递学生信息时,就通过传递MyCompoent.Student COM的Interface的方法.进行信息的交换.通过这种方式,不管是本地进程的COM还是DCOM都不会有问题.还有,当需要对COM进行升级维护时,只要调用者所使用COM的Method和Property没有被删除或改动,都一般情况下都不需要再进行修改和编译.
      

  5.   

    同意dispatchwengqun(ougun)的做法!!
      

  6.   

    我是一个初学者,dispatchwengqun说的很好,但关键是如何做,请给出例子
      

  7.   

    我采用的办法是每个表对应一个结构(在IDL中)1)在IDL中定义
      typedef struct [uuidof(......)]
      table//结构名
      {
        int x;
        int y;
      }table  
    2)在组件里使用
    3)在CLIENT使用,
       1》先IMPORT *DLL
       2》在用的文件中声名struct __declspec(uuid(....)) Table你在不明白可发信给我[email protected]
      

  8.   

    dispatchwengqun(ougun) ( ) 
    有点EJB的风格
      

  9.   

    同意使用接口来传递数据
    dispatchwengqun(ougun):能给一个例子吗?
      

  10.   

    用VC的DataConsumer时,也是一个表对应一个数据类,和dispatchwengqun(ougun)说得差不多
      

  11.   

    我试了,把数据结构定义成COM对象是可行的,
    示例代码:by : 88dd(巴迪) ( ) 信誉:100  2003-02-23 17:17:00  得分:0 
       
    pObject1->GetObject2( IDispatch** );STDMETHOD ComObject1::GetObject2( IDispatch** ppDispatch )
    {
    InterfaceYour* pInterface = NULL ;
    HRESULT hr = ::CoCreateInstance(__uuidof(ComObject2),
    NULL,
    CLSCTX_INPROC_SERVER,
    __uuidof(InterfaceYour),
    (void**)&pInterface) ;
    if ( SUCCEEDED( hr ) )
    {
                      IDispatch* pDispatch;
    hr pInterface->QueryInterface( IID_IDidispatch, &pDispatch);
                      if ( SUCCEEDED( hr ) )
                      {
                          *ppDispatch = pDispatch;
                      }
    }
             return hr;}
     
     
    谢谢88dd!!