给你参照一下我的代码:
unit serverdata;interfaceuses
  Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
  DBClient, server_TLB, StdVcl, Db, DBTables, Provider;type
  TMyData = class(TRemoteDataModule, IMyData)
    Query1: TQuery;
    Session1: TSession;
    Database1: TDatabase;
    DataSetProvider1: TDataSetProvider;
    DataSetProvider2: TDataSetProvider;
    Query2: TQuery;
    procedure MyDataCreate(Sender:TObject);
    procedure MyDataDestroy(Sender:TObject);
    procedure Query1AfterOpen(DataSet:TDataSet);
    function DataSetProvider1DataRequest(Sender: TObject;
      Input: OleVariant): OleVariant;
  private
    { Private declarations }
  protected
    class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
  
  public
    { Public declarations }
  end;var
   MyData:TMyData;implementationuses servermain;{$R *.DFM}procedure TMyData.MyDataCreate(Sender:TObject);
begin
  form1.UpdateClientCount(1);
end;procedure TMyData.MyDataDestroy(Sender:TObject);
begin
  form1.UpdateClientCount(-1);
end;procedure TMyData.Query1AfterOpen(DataSet:TDataSet);
begin
  form1.incquerycount;
end;class procedure TMyData.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
  if Register then
  begin
    inherited UpdateRegistry(Register, ClassID, ProgID);
    EnableSocketTransport(ClassID);
    EnableWebTransport(ClassID);
  end else
  begin
    DisableSocketTransport(ClassID);
    DisableWebTransport(ClassID);
    inherited UpdateRegistry(Register, ClassID, ProgID);
  end;
end;function TMyData.DataSetProvider1DataRequest(Sender: TObject;
  Input: OleVariant): OleVariant;
begin
 query1.Close;
 query1.sql.clear;
 query1.sql.add(input);
end;serverdate .dfm
object MyData: TMyData
  OldCreateOrder = False
  OnCreate = MyDataCreate
  OnDestroy = MyDataDestroy
  Left = 192
  Top = 107
  Height = 375
  Width = 544
  object Query1: TQuery
    AfterOpen = Query1AfterOpen
    DatabaseName = 'IBgjj'
    SessionName = 'Session1_2'
    SQL.Strings = (
      '')
    Left = 104
    Top = 40
  end
  object Session1: TSession
    Active = True
    AutoSessionName = True
    Left = 168
    Top = 40
  end
  object Database1: TDatabase
    Connected = True
    DatabaseName = 'IBGjj'
    LoginPrompt = False
    Params.Strings = (
      'USER NAME=GJJ'
      'password=gjj')
    SessionName = 'Session1_2'
    Left = 32
    Top = 104
  end
  object DataSetProvider1: TDataSetProvider
    DataSet = Query1
    Constraints = True
    OnDataRequest = DataSetProvider1DataRequest
    Left = 32
    Top = 32
  end
  object DataSetProvider2: TDataSetProvider
    DataSet = Query2
    Constraints = True
    Left = 112
    Top = 112
  end
  object Query2: TQuery
    DatabaseName = 'IBGjj'
    SessionName = 'Session1_2'
    SQL.Strings = (
      'select * from gjjmain')
    Left = 176
    Top = 112
  end
endclient unit
unit clientunit;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids, DBGrids, Db, DBClient, MConnect, ExtCtrls, DBCtrls;type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    Button1: TButton;
    Button2: TButton;
    ClientData: TClientDataSet;
    DataSource1: TDataSource;
    server1: TDCOMConnection;
    Edit1: TEdit;
    Edit2: TEdit;
    Button3: TButton;
    Button4: TButton;
    Edit3: TEdit;
    Label1: TLabel;
    Button5: TButton;
    Button6: TButton;
    DataSource2: TDataSource;
    clientdata1: TClientDataSet;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
 clientdata.Close;
 s:='select * from gjjmain where m13>:v1 and m13<:v2';
 clientdata.datarequest(s);//发送命令
 clientdata.FetchParams;//得到参数
 clientdata.Params[0].value:=strtofloat(edit1.text);
 clientdata.Params[1].value:=strtofloat(edit2.text);
 clientdata.open;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  Server1.Connected := True;
end;
procedure TForm1.Button3Click(Sender: TObject);
var f:textfile;s,v1:string;v2:double;
begin
if (clientdata.recordcount>0) and (clientdata.Active=true) then
  begin
    assignfile(f,'data.txt');
    rewrite(f);
    clientdata.first;
    while not clientdata.Eof do
      begin
        v1:=clientdata.FieldByName('m01').asstring;
        s:=format('%6s',[v1]);
        v1:=clientdata.FieldByName('m02').asstring;
        s:=s+format('%8s',[v1]);
        v1:=clientdata.FieldByName('m07').asstring;
        s:=s+format('%20s',[v1]);
        v2:=clientdata.FieldByName('m13').value;
        s:=s+format('%15f',[v2]);
        writeln(f,s);
        clientdata.Next;
      end;
    closefile(f);
   end
else showmessage('没有数据');
end;procedure TForm1.Button4Click(Sender: TObject);
var s:string;
begin
  clientdata.Close;
 s:='update gjjmain set m02=:v0 where m02=:v1';
 clientdata.datarequest(s);//发送命令
 clientdata.FetchParams;//得到参数
 clientdata.Params[0].asstring:=edit3.text;
 clientdata.Params[1].asstring:=edit2.text;
 clientdata.Execute;
end;procedure TForm1.Button5Click(Sender: TObject);
var s:string;
begin
 clientdata.Close;
 s:='select * from gjjmain';
 clientdata.datarequest(s);//发送命令
 clientdata.open;
 clientdata.SaveToFile('backdata.dat',dfbinary);
 if fileexists('backdata.dat') then clientdata.close;
end;procedure TForm1.Button6Click(Sender: TObject);
var s:string;
begin
clientdata.Close;
clientdata.datarequest('delete from gjjmain');
clientdata.execute;
clientdata.close;
clientdata1.close;
clientdata1.loadfromfile('backdata.dat');
s:='insert into gjjmain values(:v1,:v2,:v3,:v4,:v5,:v6,';
s:=s+':v7,:v8,:v9,:v10,:v11,:v12,:v13,:v14';
s:=s+',:v15,:v16,:v17,:v18,:v19,:v20)';
while not clientdata1.eof do
begin
clientdata.DataRequest(s);
clientdata.FetchParams;
clientdata.params[0].asstring:=clientdata1.Fields[0].asstring;
clientdata.params[1].asstring:=clientdata1.Fields[1].asstring;
clientdata.params[2].asstring:=clientdata1.Fields[2].asstring;
clientdata.params[3].AsDatetime:=clientdata1.Fields[3].AsDateTime;
clientdata.params[4].AsDatetime:=clientdata1.Fields[4].AsDateTime;
clientdata.params[5].Asstring:=clientdata1.Fields[5].Asstring;
clientdata.params[6].Asstring:=clientdata1.Fields[6].Asstring;
clientdata.params[7].value:=clientdata1.Fields[7].value;
clientdata.params[8].value:=clientdata1.Fields[8].value;
clientdata.params[9].asstring:=clientdata1.Fields[9].asstring;
clientdata.params[10].asstring:=clientdata1.Fields[10].asstring;
clientdata.params[11].asstring:=clientdata1.Fields[11].asstring;
clientdata.params[12].value:=clientdata1.Fields[12].value;
clientdata.params[13].value:=clientdata1.Fields[13].value;
clientdata.params[14].value:=clientdata1.Fields[14].value;
clientdata.params[15].value:=clientdata1.Fields[15].value;
clientdata.params[16].asstring:=clientdata1.Fields[16].asstring;
clientdata.params[17].asstring:=clientdata1.Fields[17].asstring;
clientdata.params[18].asstring:=clientdata1.Fields[18].asstring;
clientdata.params[19].asstring:=clientdata1.Fields[19].asstring;
clientdata.Execute;
clientdata1.Next;
end;end;end.initialization
  TComponentFactory.Create(ComServer, TMyData,
    Class_MyData, ciMultiInstance, tmApartment);
end.

解决方案 »

  1.   

    你用的是delphi4的语句在delphi5下做的开发是吗?
    delphi5是无状态连接的!!DELPHI4是面向连接的,在DELPHI5下我也试过和你一样的语句,结果也是一样!!
    其实在delphi5下用COMMANDTEXT可能会好些,效率也很高(详见李维的《DELPHI 5.X 分布式系统开发--系统篇》).
      

  2.   

    我没看过那本书——找不到!我用的是DELPHI4。
      

  3.   

    client
    s:=sql语句;
    clientdata.datarequest(s);//发送命令server中用TDataSetProvider
    在TDataSetProvider的事件OnDataRequest中写下
    query1.sql.clear;
    query1.sql.add(input);
    此时不要open query
    让client的tclientdataset打开如sql中有可变参数的话,请参照我的上张帖子的代码
    上面的代码在我的delphi5中已run通过
      

  4.   

    Delphi4时对于你这种例子可以导出个ActiveX方法
      

  5.   

    是不是服务器那要进行DCOM配置?我已经配置过了,而且运行时FORM能弹出,客户端用的是WINN98,是用户级访问控制。我想不是配置的问题,也不是版本的问题。下面是SERVER端程序:
    function THISserver.PvdregistDataRequest(Sender: TObject;
      Input: OleVariant): OleVariant;
    var
      filterstr: string;
    begin
      with (Sender as TProvider) do
      begin
        if input = 'STILLIN' then
        begin
          Dataset.filter := 'stillin';
          Dataset.Filtered := true;
          Reset(True);
          Result := Data;
          Dataset.filtered := false;
        end else
        if pos('R,',input) = 1 then
        begin
          filterstr := input;
          delete(filterstr,1,2);
          dataset.filter := 'roomno = ''' + filterstr + '''';
          dataset.filtered := true;
          reset(True);
          Result := data;
          Dataset.filtered := false;
        end else
        if pos('G,',input) = 1 then
        begin
          filterstr := input;
          delete(filterstr,1,2);
          dataset.filter := 'regunit = ''' + filterstr + '''';
          dataset.filtered := true;
          reset(True);
          Result := data;
          Dataset.filtered := false;
        end else
        if pos('P,',input) = 1 then
        begin
          filterstr := input;
          delete(filterstr,1,2);
          dataset.filter := 'regperson = ''' + filterstr + '''';
          dataset.filtered := true;
          reset(True);
          Result := data;
          Dataset.filtered := false;
        end else
        if pos('C,',input) = 1 then
        begin
          filterstr := input;
          delete(filterstr,1,2);
          dataset.filter := 'regcode = ''' + filterstr + '''';
          dataset.filtered := true;
          reset(True);
          Result := data;
          Dataset.filtered := false;
        end;
      end;
    end;