实时建立dsp的可不可行??谁在项目中使用动态建立的dsp??

michaelpeng7799 2003-11-14 12:30:52
如果使用动态dsp如下程序:

function TBaseBillobj.BillDetailLoad(TableName: string;
BillnumberID: integer): OleVariant;

var
sql,STableName:string;
qry:TADOQuery;
dsp:TDataSetProvider;
begin
qry:=TADOQuery.Create(self);
dsp:=TDataSetProvider.Create(self);
try
sql:=GetDetailVisibleField(TableName,STableName);
sql:='Select pdt.fullname as ÉÌÆ·,pdt.usercode as ±àÂë,'+sql+
' from '+rightstr(TableName,length(TableName)-1)+' as '+STableName+
' inner join pdtbase as pdt'+' on pdt.baseID='+STableName+'.pdtbaseID '+
' where billnumberID=:billnumberID ';
qry.Connection:=FConnection;
qry.SQL.Text:=sql;
qry.Parameters.ParamByName('billnumberID').Value:=BillnumberID;
qry.Open;
if qry.RecordCount<=0 then exit; //<<<<<<<<--------
dsp.DataSet:=qry;
Result:=dsp.Data;
finally
qry.Free;
dsp.Free;
end;
end;
上面的function先用adoquery取数据,然后datasetprovider(dsp)的dataset=adoquery,返回一个data给客户。
然后客户修改好数据后用dcom接口将修改的数据送到服务器,如下两个data包
dmClient.sckMain.AppServer.SaveBill(cdsBillHead.Data,cdsBillDetail.Data,self.ClassName,ReturnValue,Tag);

服务器得到数据包还要通过dsp的ApplyUpdates才能将数据存入数据库,如下:
HeadDsp.ApplyUpdates(BillHead,0,Result);
DetailDsp.ApplyUpdates(BillDetail,0,Result);

但问题来了,如果像最上面的function一样是在function内实时建的一个dsp,而不是放在DM上的一个静态的dsp,所以在执行完最上面function取数据后那个dsp也就没了,在最后用dsp.ApplyUpdates方法存数据库时,是要求调用ApplyUpdates方法的dsp是要打开原先被更新过的数据库的,不然它是不知道把修改的好的数据更新到哪去的,所以问题就要这了,在做更新功能时不能用动态的dsp要用放在DM上的静态DSP!! 除飞在dsp.ApplyUpdates前再次用一个adoquery打开数据集,然后与dsp关联,再调dsp.ApplyUpdates。可是这样太麻烦了,有性能损失啊。

   有没有好的办法使用动态dsp实现更新功能的????多谢!!



...全文
43 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
michaelpeng7799 2003-12-04
  • 打赏
  • 举报
回复
问题已解决,我最后用dcom接口方法传client.delta或data
服务器方dsp和cds结合使用以提取数据用data传到客户方。
这样就不用dsp长期存在,临时用一下就可以。
billy_zh 2003-11-14
  • 打赏
  • 举报
回复
可以考虑把DataSetProvider放到一个DataModule中,
而这个DataModule是动态创建/释放的。
michaelpeng7799 2003-11-14
  • 打赏
  • 举报
回复
可我那dsp关联的adoquery打开的是一个多表查询结果。
lvloj 2003-11-14
  • 打赏
  • 举报
回复
是要求调用ApplyUpdates方法的dsp是要打开原先被更新过的数据库的,不然它是不知道把修改的好的数据更新到哪去的,所以问题就要这了:
在DSP的OnGetTableName事件中写:
TableName := 要更新的表名; //即可.
lvloj 2003-11-14
  • 打赏
  • 举报
回复
可我那dsp关联的adoquery打开的是一个多表查询结果.
试试:
if DataSet = ADOQueryMaster then TableName := 要更新的主表名;
if DataSet = ADOQueryDetail then TableName := 要更新的从表名;

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧