给你参照一下我的代码:
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.
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.
delphi5是无状态连接的!!DELPHI4是面向连接的,在DELPHI5下我也试过和你一样的语句,结果也是一样!!
其实在delphi5下用COMMANDTEXT可能会好些,效率也很高(详见李维的《DELPHI 5.X 分布式系统开发--系统篇》).
s:=sql语句;
clientdata.datarequest(s);//发送命令server中用TDataSetProvider
在TDataSetProvider的事件OnDataRequest中写下
query1.sql.clear;
query1.sql.add(input);
此时不要open query
让client的tclientdataset打开如sql中有可变参数的话,请参照我的上张帖子的代码
上面的代码在我的delphi5中已run通过
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;