C
cocoboy79
Unregistered / Unconfirmed
GUEST, unregistred user!
如果使用动态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实现更新功能的????多谢!!
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 &Eacute;&Igrave;&AElig;·,pdt.usercode as ±à&Acirc;&euml;,'+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实现更新功能的????多谢!!