多层结构中clientdataset更新数据的问题。 (50分)

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

caijitao

Unregistered / Unconfirmed
GUEST, unregistred user!

我在客户端使用applyupdates提交更新,在应用服务器端的onbeforeupdate中写代码如下:
procedure Tmulti_test1.DSProV_4BeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet;
DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind;
var Applied: Boolean);
var
ttname1,ttname2:string;
begin
if UpdateKind = ukModify then
begin
ttname1 :=deltads.FieldByName('title').AsString;
ttname2 :=deltads.FieldByName('title_id').OldValue;
with q_publicexecdo
begin
close;
SQL.Clear;
SQL.Add('update titles set title='+QuotedStr(ttname1)+' where title_id='+QuotedStr(ttname2));
ExecSQL;
end;

Applied :=true;
end;

end;
但提交始终不成功,报错信息:在事务处理过程中,连接对对象不能被明确的切断。
语句生成的SQL并没有错误,可以在查询分析器中正常执行。经TRACE,发现MIDIAS自动启动了事务。所以将代码中加上
adoconnet.rollbacktrans;
第一次执行可以成功,可再执行applyupdates系统竟会报:灾难性错误!!!!
然后再也不能成功提交。
怎么解决呢?
 
wo kao,把reslovetodataset 设为true就没事了...
看来如果是reslovetodataset设为false即使是将Applied :=true它还是要试着去生成UPDATE,虽然它不执行,但它会改动事务。
再说一句,有没有高手认为是其它可能?
 
reslovetodataset设为false时DSProV_4会自动生成SQL叙述。
 
分数不送不行...
这样吧,若我的clientdataset的packetrecord设为-1,fetchOnDemand设为True,那我的对象是否是有状态的?
 
好像是无状态的把,没有要维护的状态啊(比如游标什么的),
 
这个问题很郁闷。。。
实际上tclientdata有很多功能是没有用的,或者并不像我们所理解的那样,发展到d7了,clientdataset还没有完善好!
如:reslovetodataset=true
1.我们通常认为它用dataset来更新数据集了,实际上不是这样的!我们把Tupatesql的update sql的where 条件设成按key更新,但是通过检视器我们看到它还是用所有字段去匹配了。
2.reslovetodataset=true 的时候provider的updatemode 只能是whereall,否则就会报错!我怀疑sql 语句的where 条件只能由provider来产生!
3.reslovetodataset=false 的时候无论我们设provider的updatemode 为什么,它实际都是按key去匹配记录的!
郁闷。。。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
604
import
I
后退
顶部