客户说程序报错——“无法为更新定位行。一些值可能已在最后一次读取后已更改”。
反复试之无法再现。再问客户,说用的是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;
于是天下和谐了!