对于第一种方法你是调用ClientDataSet1.Appserver.DisplayInfo,这样用的话,需要加入什么
接口库,我以前到试验过,李维的书有介绍,另外,我想你在客户端不通过Appserver调用,通过
CreateInstance创建一服务对象,在调用相应的过程,我就是这么干的

解决方案 »

  1.   

    to xzgyb:
    我的Server是这样定义的:  Server:ICommonCDM;//CommonCDM是Corba对象类名,并且我也:
    Server:=TCommonCDMCorbaFactory.CreateInstance('dd');
    其他设置我想都正常,所以省略了。
    ------------------------------------------------------------------------------
    我想,既然静态的SQL语句能行,为什么动态不行呢?
    若在服务器端写静态SQL语句,客户端CLientDataSet直接Open就可以了。
    要不CLientDataSet.CommandText:='SQL语句'也行,但我不希望在客户端编写SQL语句。
      

  2.   

    帮帮忙啦!通常都怎么来解决类似问题?李维的例子,大多是静态语句,或者使用Table,好不容
    易有个动态的,还是在客户端写的。
      

  3.   

    不好意思,我试也没成功,服务器的过程是调用成功,但我跟踪进服务器端的
    VCL源代码,发现它在SetPrepared过程里取的Text还是原来的值,不知为什么
    在试一试
      

  4.   

    经过实验,我发现,第二种方法改用DCOM可以实现:
    服务器DCOM模块:
      procedure Displayinfo;
      begin
          Query.Close;
          Query.SQL.Clear;
          Query.SQL.Add(SQL语句);
          Query.Open;
      end;  在客户端调用:
      ...
      ClientDataSet.Close;
      DCOMConnection.AppServer.DisplayInfo;
      ClientDataSet.Open;  
    完全正常,但用Corba模块仍然不行。
    同时感谢Jneu、xzgyb、Tense的热切关注和支持。
      

  5.   

    欢迎Corba爱好者前来出谋划策!
      

  6.   

    我不懂corba,只是想提个建议:是否应该在客户端添加sql语句前,判断服务器端的sql语句肯定已经添加上并且已经激活?希望没有影响你们的思路!
      

  7.   

    谢谢各位,我想这点应该不是问题,因为用DCOM模块完全正常,只是Corba模块不行。
      

  8.   

    使用Corba结构,中间层若使用CorbaDataModule,那么如果通过类型库
    在接口中添加其他方法,然后在客户端通过AppServ直接调用接口方法是
    不行的(使用DCOM可以),不知是不是这个原因。若是,解决方法可参考
    李维的系统篇。
      

  9.   

    我没有使用ClientDataSet.AppServ.方法,而是:
    我的Server是这样定义的:  Server:ICommonCDM;//CommonCDM是Corba对象类名,并且我也:
    Server:=TCommonCDMCorbaFactory.CreateInstance('dd');
    --------------------------------------------------------------------------------
    希望关注此问题的朋友将此问题提前,谢谢!
    我将为此问题付出1000分,悬赏高手求解!
      

  10.   

    我用的和你们不一样
    注意delphi5对corba支持的很差
    我用的是java做服务端,delphi只用来做客户端,连接的时候并不用delphi的corbaConnection
      

  11.   

    我现在也在怀疑delphi5对corba的支持.
    to qiandeng(千灯):你用什么控件连接服务器?
      

  12.   

    最近研究表明问题集中在一点:
    无论你如何在中间层怎样赋值,在客户端ClientDataSet.Open时,中间层Query.SQL总是保持
    原值,除非你用CommandText或DataRequest来传递SQL语句。
    为什么在客户端ClientDataSet.Open时,中间层Query.SQL总是保持
    原值?
    ------------------------------------------------------------------------------
    这一点xzgyb(老达摩) 已提早发现。
      

  13.   

    恭喜你,你的心情可以好起来了。^_^你的问题出在Server的建立上,你原来用Server:=TCommonCDMCorbaFactory.CreateInstance('dd');实现,但你所建立的的Server和你客户端运行时所建立的接口并不是同一个实例(instance),因此当你成功调用Server的方法修改了Server实例对应的Query后,你的ClientDataSet却去访问另一个(自动创建的)实例的Query,你当然是出错了。解决办法,在你创建Server实例时使用以下办法:
    server:=IUnknown(CorbaConnection1.AppServer) AS ICORBA_PassSQL;
    这样就可以确保Server和ClientDataSet所调用的是同一个实例。通过上述修改后,程序能顺利运行。补充说明:我不是高手(初学DELPHI),以上回答可能存在错误,请大家指正并共同进步。
      

  14.   

    Hyphoon(间接点球):极有道理,但:
    server:=IUnknown(CorbaConnection1.AppServer) AS ICORBA_PassSQL;
    一句,我不能编译,请问需要加入什么其他单元吗?
      

  15.   

    OK,renzhm,多谢HypHoon老兄了,哈哈
    在中间层创建时改为
     TCorbaVclComponentFactory.Create('TESTFactory', 'TEST', 'IDL:Project1/GYBFactory:1.0', ITEST,
        TTEST, iSingleInstance, tmSingleThread);
    倒数第二个改为iSingleInstance也行,默认为iMultiInstance
    这样就为同一个实例了,呵呵
    真的心情可以好起来了..呵呵
      

  16.   

    To renzhm(戴尔飞):这是我客户端的源码:unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, DBClient, CorbaCon, ExtCtrls, DBCtrls, Grids, DBGrids, Project1_TLB,
      StdCtrls;type
      TForm3 = class(TForm)
        DBGrid1: TDBGrid;
        DBNavigator1: TDBNavigator;
        DataSource1: TDataSource;
        ClientDataSet1: TClientDataSet;
        CorbaConnection1: TCorbaConnection;
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        server:ICORBA_PassSQL;
      public
        { Public declarations }
      end;var
      Form3: TForm3;implementation{$R *.DFM}procedure TForm3.FormCreate(Sender: TObject);
    begin
      ClientDataSet1.Active:=false;
      try    server:=IUnknown(CorbaConnection1.AppServer) AS ICORBA_PassSQL;  Except
        On E:Exception Do ShowMessage(E.Message);
      end;end;procedure TForm3.Button1Click(Sender: TObject);
    begin
      try
        ClientDataSet1.Active:=false;
        server.DisplayInfo_Title;
        ClientDataSet1.Active:=true;
      except
        on E:Exception Do ShowMessage(E.Message);
      end;
    end;procedure TForm3.Button2Click(Sender: TObject);
    begin
      try
        ClientDataSet1.Active:=false;
        server.DisplayInfo_Employee;
        ClientDataSet1.Active:=true;
      except
        on E:Exception Do ShowMessage(E.Message);
      end;
    end;end.To xzgyb(老达摩):你这样做CORBADataModual就变成ShareInstance模式了,效率也许会有所下降。
      

  17.   

    hyphoon:
    是吗,但这也是李维书上提到的Shared Server模式,不说是一般都用这种模式吗
    这也是无状态对象,多个客户端共享一实例,
    另外用Appserver接口不也需要注册接口吗
    我不太懂,还得看看书在说