在三层模式下DCOMconnection和socketconnection连接的区别?(100分)

  • 主题发起人 主题发起人 chendy095
  • 开始时间 开始时间
C

chendy095

Unregistered / Unconfirmed
GUEST, unregistred user!
//取得数据集
procedure Tdmf.GetClientData(sqlstr:string;ADOQuery:TADOQuery);
var mydata:oleVariant;
begin
//读数据包
DCOMConnection1.AppServer.getdata(sqlstr,mydata);
ADOQuery.Recordset:=IUnKnown(mydata) as _Recordset;
end;
这段代码是用DCOMconnection连接应用服务器端,取得Recordset成功,我想用socketconnection替换时,ADOQuery.Recordset:=IUnKnown(mydata) as _Recordset;会报错,为什么?DCOMconnection和socketconnection在这里的应用有何不同?
 
欢迎大家踊跃发表意见看法
 
客户端取得了 OLEVariant包后,可直接用ClientDataSet.Data加载。
DCOM --> Distributed COM,分布式COM技术,可穿防火墙,稳定,但连接时较慢
Socket --> 通过 Borland的scktsrvr.exe通信,配置简单,使用方便。
 
嗯,我是在尝试各种方法来实现数据查询、传输的高速性。
想用socketconnection来实现这样的数据传输,可是出现了问题,这个问题该如何解决?希望大家提出意见
 
DCOM還有中間層具有權限管理,但設置較麻煩。
同時只能在WIN平台上用、速度也慢。
 
//读数据包
DCOMConnection1.AppServer.getdata(sqlstr,mydata);
ADOQuery.Recordset:=IUnKnown(mydata) as _Recordset;
end;
这段代码是用DCOMconnection连接应用服务器端,取得Recordset成功,我想用socketconnection替换时,ADOQuery.Recordset:=IUnKnown(mydata) as _Recordset;会报错,为什么?DCOMconnection和socketconnection在这里的应用有何不同?
 
你把用socketconnection寫的碼帖出來看下,才易於找問題。
其實它們之間區別有:采用的協議不一樣,還有就是支持的接口梆定方式dcom要多種。其它基本上差不多。
 
是这样的
server:
procedure TMyCoCl.getdata(SqlStr: OleVariant;
out vData: OleVariant);
var filename:string;
i:integer;
CompressedStream:TMemoryStream;
begin
if not ADOQ_query.Active then
begin
ADOQ_query.SQL.Text :=sqlstr;//sql语句
try
ADOQ_query.Open;
vData:=ADOQ_query.Recordset ;
//保存数据集
finally
ADOQ_query.Close;
end;
end;
end;

client;
procedure Tdmf.GetClientData(sqlstr:string;ADOQuery:TADOQuery);
var mydata:oleVariant;
begin
//读数据包
socketConnection1.AppServer.getdata(sqlstr,mydata);
ADOQuery.Recordset:=IUnKnown(mydata) as _Recordset;
end;

这是客户端接受应用服务器端的数据,我想应该是socket支持接口绑定的问题。
还有就是用DCOM连接时的批保存问题,
server:
procedure TMyCoCl.UpdateData(var vData: OleVariant;
out ErrorMessage: OleVariant);
var filename:string;
begin
if ADOConnection1.InTransaction then
begin
ErrorMessage:='保存错误';
exit;
end;
try
ADOConnection1.begin
Trans;
//开始事务
ADOQ_update.Recordset:=IUnKnown(vData) as _Recordset;
ADOQ_update.UpdateBatch(arAll);
//保存
//回传数据
vData:=ADOQ_update.Recordset ;
ADOConnection1.CommitTrans;
//提交事务
except
{出错处理}
end;
ADOQ_update.close;
end;

client:
//保存数据
procedure Tdmf.SaveData(var ADOQuery:TADOQuery;var ErrorMessage:string);
var vData:OleVariant;
Errorstr:variant;
filename:string;
begin
vData:=ADOQuery.Recordset ;
DCOMConnection1.AppServer.UpdateData(vData,Errorstr);
if Errorstr<>'' then
ErrorMessage:=Errorstr
else
begin
ErrorMessage:='';
//回传数据
ADOQuery.Recordset:=IUnKnown(vData) as _Recordset;
end;
end;
ADOQ_update.UpdateBatch(arAll);
此句失效
应用服务器端不能更新到数据源,问题在哪里?是Recordset这种方式本身不能这样用嘛?
 
建议在中间层放一个ClientDataSet,指向ADOQuery绑定的Provider,
然后直接返回ClientDataSet.Data。
 
帮顶!
http://www.source520.com
站长开发推广同盟 站长朋友的终极驿站
同时拥有海量源码电子经典书籍下载
http://www.source520.com/search/search.asp
&quot;编程.站长&quot;论坛搜索引擎-----为中国站长注入动力!
 
我这段程序目的就是为了避开直接返回ClientDataSet.Data,因为有时这样的数据量过大,传输速度会很慢的。
 
直接用Provider
 
我也注意到这个问题,没有解决.用DCOM就可以,socktsvr不可以.
 
帮顶!
╭=========================================╮
80G海量源代码,控件,书籍全免费狂下不停!
http://www.source520.com

╰=========================================╯
 
多人接受答案了。
 
后退
顶部