在多层应用中,应用服务器的RemoteDatamodule 内放置控件 TQuery ..(100分)

  • 主题发起人 主题发起人 dblin
  • 开始时间 开始时间
D

dblin

Unregistered / Unconfirmed
GUEST, unregistred user!
在多层应用中,应用服务器的RemoteDatamodule 内放置控件 TQuery
TQuery 的属性SQl 是如下类似的无返回数据集的语句:
Update Insert Delete ...
接口通过 TProvide。 在客户断用TClientDataSet 与 TProvide 连接
由于TClientDataSet 没有EXECSql 类似的方法。又不能用open方法。请问用在三层结构中如何处理该问题。
 
通过ClientDataSet.Provider.DataRequest('')传递空字符串来激发应用服务器
段的OnDataRequest事件,在OnDataRequest事件中调用TQuery的Open或ExecSql
方法
ClientDataSet.Provider.DataRequest可将Sql语句动态的传递到应用服务器端

应用服务器端:
function TQueryDemo.AdHocProviderDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
begin
Query1.ExecSQL;
end;
客户端
procedure TForm1.RunButtonClick(Sender: TObject);
begin
{ Send the query string to the server and try to open the client dataset }
ClientData.Close;
ClientData.Provider.DataRequest(SQL.Lines.Text);
end;

可仔细分析demos/midas/adhoc目录下的例子,相信有不小的收获

 
我非常同意Liu JZX的看法。
下面我想谈一谈我的实现方法,请各位指教:
1、通过为RemoteDatamodule 增加一Method:
function execsql(Esql: OleVariant): WordBool;
safecall;
2、该Method的实现如下:
query1.Close;
query1.SQL.text:=ESql;
try
query1.execsql;
except
result:=false;
exit;
end;
result:=true;
3、客户端:
procedure TForm1.Button1Click(Sender: TObject);
begin
if DCOMConnection1.AppServer.execsql(edit1.text) then
messagebox(self.handle,'ok','ok',mb_ok)
else
messagebox(self.handle,'error','error',mb_ok) ;
end;
这样也能实现你的要求,如果你希望将服务器端的错误信息返回客户端可以
增加一个返回参数来实现。
 
谢谢大家的指教,我理解了!
 
在D5中,可用CLIENTDATASET的COMMANDTEXT;
 
多人接受答案了。
 
ClientDataSet.Execute
 
jzxm 的方法对Delphi5 可用,对Delphi4 无效!!!
 
后退
顶部