在三层中,如何在客户端执行Insert等SQL语句?(50分)

  • 主题发起人 主题发起人 Thinboy
  • 开始时间 开始时间
T

Thinboy

Unregistered / Unconfirmed
GUEST, unregistred user!
在三层中,如何在客户端执行Insert等SQL语句?
在两层中,可以用SQL.Text:='Insert......';ExecSQL来执行,
但在三层中,又如何呢?
可否给段例子?我尝试调用服务端的过程,但是又不知道如何
传递变量,及在服务端的过程ExecSQL后,在客户机还要
ClientDataSet.Open吗?
谢谢!
 
AppServer端:
添加一个远程数据模块:Name为ReMoData,在远程数据模块里添加Database1、
Query1,并且设置好
各自参数。
打开*_tlb.pas
添加New Method,改为A,并修改参数。
在protected下面自动添加代码:
procedure A(const SQLStr: WideString);
safecall;
在implementation下面添加代码:
procedure TRemoData.A(const SQLStr: WideString);
begin

Query1.SQL.Text := SQLStr;
//Data := Query1.Provider.Data;
Query1.Execsql;
end;

客户端:
添加一个DCOMConnection1和Button1,在Button1添加以下代码:
procedure TForm1.Button1Click(Sender: TObject);
var
ab:String;
begin

ab:='insert into table2(name) Select Name From Table1';
if not Clientdataset1.reser1.Connected then

Clientdataset1.reser1.Connected := True;
Clientdataset1.reser1.AppServer.A(ab);
end;

这样我先注册一下AppServer端,然后运行客户端,按Button1看有没有问题。
如果是Select,先把AppServer的procedure A(const SQLStr: WideString);
sa
fecall;
修改为procedure A(const SQLStr: WideString;
out Data: OleVariant)
;
safecall;
注意,不是这样直接修改,而是修改*_tlb.pas里面的参数。把
procedure TRemoData.A(const SQLStr: WideString);
begin

Query1.SQL.Text := SQLStr;
//Data := Query1.Provider.Data;
Query1.Execsql;
end;

修改成:
procedure TRemoData.A(const SQLStr: WideString;
out Data: OleVari
ant);
begin

Query1.SQL.Text := SQLStr;
Data := Query1.Provider.Data;
end;

在前端:

procedure TForm1.Button1Click(Sender: TObject);
var
ab:String;
begin

ab:='insert into table2(name) Select Name From Table1';
if not Clientdataset1.reser1.Connected then

Clientdataset1.reser1.Connected := True;
Clientdataset1.reser1.AppServer.A(ab);
end;

改成:
procedure TForm1.Button1Click(Sender: TObject);
var
Data: OleVariant;
ab:String;
begin

ab:='select * from table1';
if not DCOMConnection1.Connected then

DCOMConnection1.Connected := True;
DCOMConnection1.AppServer.A(ab, Data);
ClientDataSet1.Data := Data;
end;

祝你好运!

 
fatao老兄,用得着那么直接去改*.TLB文件吗?
你在RemoteDataModule转到Source页,从Edit中
选择"Add Interface .."那一项.就会有一个对话框,
输入一个procedure,function,property,跟平常的语法
一样,不过,String用WideString可以了.
以后的步骤就差不多了.
 
D5's clientDataSet supports commandText property for sql use.
Some said, can use clientdataset.provider.xxx to send sql command? in d4
 
ClientDataSet1.Provider.DataRequest('insert into xxxx....');
function TForm1.Provider1DataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
begin
with (Sender as TProvider)do
begin
query1.sql.clear;
query1.sql.add(Input as string);
query1.execsql;
reset(true);
Result := Data;
end;
end;
 
多人接受答案了。
 
各位大虾,我使用D5的CommandText:='insert into...'语句后,
出现CLIENTDATASET没有返回结果的异常出错,可是我并不需要
返回结果啊,如何解决啊,急...............
 
后退
顶部