现在的位置: 首页 > 综合 > 正文

奇怪的“无法为更新定位行。一些值可能已在最后一次读取后已更改”

2013年09月18日 ⁄ 综合 ⁄ 共 492字 ⁄ 字号 评论关闭

客户说程序报错——“无法为更新定位行。一些值可能已在最后一次读取后已更改”。

反复试之无法再现。再问客户,说用的是Oracle数据库,一试,果不其然,报错。


查代码,发现原来是这个样子滴:

FDataSet.Edit;

FDataSet.FieldValues['name'] := Text;

FDataSet.Post;


当第一次Text=''时,post没有异常,紧接着第二次Text<>''时,post报错!!!

这是为神马呢?

原来啊,oracle库默认的''和NULL是一回事,于是第一次Post后,DataSet的值是'',而库里这时保存的是NULL,于是乎,第二次再Post时,数据库认为DataSet的数据与库里的数据不一致,就大吼一声“无法为更新定位行。一些值可能已在最后一次读取后已更改”。


真想大白,动手改为:

 

FDataSet.Edit;

if Trim(Text) <> '' then

   FDataSet.FieldValues['name'] := Text

else

   FDataSet.FieldValues['name'] := Null;

FDataSet.Post;


于是天下和谐了!

 

抱歉!评论已关闭.