关于Corba实现的问题?(50分)

  • 主题发起人 主题发起人 renzhm
  • 开始时间 开始时间
R

renzhm

Unregistered / Unconfirmed
GUEST, unregistred user!
在客户端实现显示数据的功能,用动态SQL语句实现,考虑到维护的方便性,SQL语句
不在客户端编写,而在服务端编写,而服务端的TQuery控件也采用动态赋值的方法,但
如何把SQL语句传给TQuery控件?本人用几种方法均告失败。
1、服务器端写一过程:
procedure Displayinfo;
begin
Query.Close;
Query.SQL.Clear;
Query.SQL.Add(SQL语句);
Query.Open;
end;

在客户端调用:
...
ClientDataSet.Close;
Server.DisplayInfo;
ClientDataSet.Open;

这个方法将导致灾难性错误,连Delphi都不能捕获。
.......

在万般无奈的情况下,我采用了个苯方法:
在服务器端编写一过程,返回SQL语句,再由客户端传回到服务器端,宣告成功!

客户端:
ClientDataSet.Close;
ClientDataSet.DataRequest('由服务器端传来的SQL语句');
ClientDataSet.Open;
当然在服务器端,对应的TDataSetProvider的OnDataRequest事件中:
Query.SQL.Text:=Input;
------------------------------------------------------------------
很清楚,这种方法虽然能够实现,但“极不科学”,请问我的第一种方法错在哪?
还有什么更好的方法?请不吝赐教。
[:(!]
 

procedure Displayinfo;
begin
lock;
// 你需要排他性访问
try
Query.Close;
Query.SQL.Clear;
Query.SQL.Add(SQL语句);
Query.Open;
finally
unlock;
//释放
end;
end;

原因你参考Apartment 模型的参考。
 
按照您的方法试过了,仍然是同样的错误。
我查过当ClientDataSet.Open;执行时,TQuery的SQL.Text值仍为原值。
同样的语句使用DCOM模块就没有问题。
 
请高手指点[:(]
 
采用TClientdataset.commandtext
 
qiu_peking:
采用TClientdataset.commandtext
也得给它赋值呀,仍然要在客户端写sql语句
 
给你两个建议
1、服务器端不要Query.Open
2、如果你是静态绑定,跟踪进去看看在什么地方出的问题
 
>>Server.DisplayInfo;
请问Sever是指CorbaConnection.AppServer吗?你在服务端有DisplayInfo这个接口吗?
如果有还出错你再看看把Server改成静态绑定的,还出错再说。
注:如果你在服务端实现,应该是如下代码:
TEmpServer = class(TRemoteDataModule, IEmpServer)
private
...
protected
procedure DisplayInfo;
safecall;
...
end;

...

procedure TEmpServer.DisplayInfo;
begin
...
end;
 
后退
顶部