利用DCOM建立了3层,远程数据模块(名字为DCOMServer)中放置了TDATABASE、TQuery、TDataSetProvider;客户端放置了DCOMConnection、TClientDataSet、TDataSource,到这里连接都成功了,数据也从设定好的一个表中成功取出并在DBGrid中显示了。然后照书上所说在远程数据模块中利用Type Library在IDCOMServer下添加新的方法叫nwQuery,设置了两个参数,并编写了代码用于重新设置远程数据模块中的TQuery的SQL属性。然后书上说要在客户端调用该服务只需将Provider的Exported属性设为True(已设置),客户端添加以下代码即可:ClientDataSet1.AppServer.nwQuery(参数)。我是将该代码放于客户端的一个按钮点击事件下的,但是奇怪的是输入到AppServer.  后面没有出现nwQuery这个方法可供选择,强行写上后也没有用,有高手能帮忙下吗?万分感谢!

解决方案 »

  1.   

    ClientDataSet1.AppServer.nwQuery(参数)。
    这个不对。应该是DCOMConnection.
      

  2.   

    远程数据模块已经注册过了,运行了一次!不知道是不是你说的服务器接口注册另外我也试过了你说的,我程序里是DCOMConnection1,我试了DCOMConnection.AppServer。也是到AppServer后面就没有选项显示了,可以硬向后面添写nwQuery吗?
      

  3.   

    上面写错了点,应该是“我程序里是DCOMConnection1,我试了DCOMConnection1.AppServer。”另外nwQuery函数设置的参数是两个,分别是CODE(WideString)、XM(WideString)。程序中调用该函数时传过去的是两个文本框内输入的值。代码就是:DCOMConnection1.AppServer.nwQuery(ID.Text,Name.Text)。
      

  4.   

    上面我也看错了。你这样调用。
    procedure TForm2.Button1Click(Sender: TObject);
    var
       aa:Iasasasas;//这是你的_TLB文中定义的接口。你查一下这个自动生成的文件会看到。
       strSql:WideString;begin
        aa:=Coasasasas.Create;//要创建一个对象。
        aa.wy(strSql);
        showmessage(strSql);end;先说明:APPSERVER接口是取不到自定义方法的。
    首先在USE中加入你项目的_TLB单元。
    _TLB自动生成的接口如下。一般在此文件最后部分。class function Coasasasas.Create: Iasasasas;//接口
    begin
      Result := CreateComObject(CLASS_asasasas) as Iasasasas;
    end;//DCOM兼容接口
    class function Coasasasas.CreateRemote(const MachineName: string): Iasasasas;
    begin
      Result := CreateRemoteComObject(MachineName, CLASS_asasasas) as Iasasasas;
    end;
      

  5.   

    又有问题了,真不好意思,按照你说的是可以调用了,但调用后应该是重新取得了新的记录,但很奇怪在客户端反映不出来,我函数的代码是:
    procedure TDCOMServer.nwQuery(ID, Name: OleVariant);
    begin
        Query1.Close;
        Query1.SQL.Clear;
        Query1.SQL.Add('select * from 博士后基本信息表 where BSHH=:BSH and XM=:NXM' );
        Query1.ParamByName('BSH').Value:=ID;
        Query1.ParamByName('NXM').Value:=Name;
       Query1.Open;
    end;
    客户端的按纽点击后应该执行该过程,并取得新记录在DBGrid上反映出来,但事实上没有,我的点击事件的代码如下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Inter:IDCOMServer;
      UID:OLEVariant;
      UName:OLEVariant;begin
           UID:=id.Text;
           UName:=name.Text;
           inter:=CoDCOMServer.Create;
           Inter.nwQuery(UID,UName);
           ClientDataSet1.Refresh;
           DBGrid1.DataSource:=DataSource1;
           DBGrid1.Visible:=True;
    end;
    奇怪就是无法在客户端反映出来,555555
      

  6.   

    ”APPSERVER接口是取不到自定义方法的“真是如此吗?我在书上看到过:”通过MIDAS链接组件的AppServer属性可以获得应用服务器上远程数据模块的接口,通过此接口可以调用远程数据模块的方法“
      

  7.   

    TO:楼上。APPSERVER只能取到远程模块的集成方法啊。
    TO:楼主。你这样取数据的方法我觉得并不好。clientdataset本身就可以到得数据,你在中间层更新的数据,但clientdataset的commandtext值估计你没改,所以refresh后,客户端还是根据clientdataset的commandtext来通过中间层取得数据。看上去数据是没有变化。取数据的话可以用APPSERVER的集成方法。都是AS_开头的。直接返回数据封包,不用DCOM。这是MIDAS3.0无状态对象的核心技术啊。方法说明你可以看看_TLB文件。
    PS:建议人这样的系统做成COM+对象,更好一些。
      

  8.   

    commandtext值我一开始就没有设定。我主要是想利用nwQuery来达到一个查询功能,现在刚开始只想是能够通过设定参数在同一张表中查询出符合要求的记录,但我真正想达到的是让用户选择该数据库中的任意一张表,再通过输入查询参数来得到记录,并不是只针对同一张表。不知道我通过nwQuery能否实现.....
      

  9.   

    还有你说的APPSERVER的集成方法,是直接利用ClientDataSet的APPSERVER吗?
      

  10.   

    还有你说的APPSERVER的集成方法用IAppServer就行了。用它的AS_GetRecordSet方法。到得一个OleVariant型的变量。
    让clientdataset.data:=这个变量就行了。function AS_GetRecords(const ProviderName: WideString; Count: Integer; outRecsOut: Integer;Options: Integer; const CommandText: WideString; var Params: OleVariant;var OwnerData: OleVariant): OleVariant;CommandText值不同,就可以取不同的表了。
    var
     ServerProject:Iappserver;  //
     Option: TGetRecordOption;
       iRecOut: Integer;
       OwnerData: OleVariant;
       Params,vDatas: OleVariant;
       strSql:WideString;
    begin
    strSql:='select * from tblname';
    vDatas:=MyConnect.AS_GetRecords('dspQuery',-1,iRecOut,Byte(Option),strSql,Params,OwnerData);
     cdsXX:=vDatas;
    end;
      

  11.   

    刚才写错了,重发。
    var
     ServerProject:Iappserver;  //
     Option: TGetRecordOption;
       iRecOut: Integer;
       OwnerData: OleVariant;
       Params,vDatas: OleVariant;
       strSql:WideString;
    begin
    strSql:='select * from tblname';
    ServerProject:=DComConnection1.GetAppServer;
    vDatas:=ServerProject.AS_GetRecords('dspQuery',-1,iRecOut,Byte(Option),strSql,Params,OwnerData);
     cdsXX:=vDatas;
    end;
      

  12.   

    本来就不会有选择,要你自己添加进去的,你检查一下参数的顺序对了没有,写乱了
    传不过去的,再不行的话检查你的SQL语句,例如要这样写:select * from 表名 where
     name='''+参数+''' ,如果有整型要这样写select * from 表名 where  name='+inttostr(参数)+’;如果再不行的话把database拿开,不要放在远程数据模块,会有影响的,我建议你用ADO控件,连数据源都省了