ADO错误: 无法为更新定位行。一些值可能已在最后一次读取后已更改解决办法

对日期格式的赋值出现问题。取消日期格式赋值后问题消失。
出现问题时的赋值方式: ado->Fields->operator[i]->AsDateTime = *(TDateTime*) temp;

ADO在保存时提示错误:“无法为更新定位行。一些值可能已在最后一次读取后已更改”
这个问题困扰了大半天,在网上查询了很多这类问题解决方法,大都说得很模糊,未能根本解决问题
有说跟字段的设置了默认值有关,也有说是其他用户更新了记录,我就写了一个很简单的程序来跟踪,
就数据库也保证只有一个用户连接,结果发现问题出在一个DateTime型字段上,修改其它任何字段都
没有问题,一旦修改该字段然后UpdateBatch()就会报错,经过反复测试,终一找到问题的根源:
  数据库(Sybase)中该字段存的值精确到了毫秒,如'2009-06-09 14:08:33.756',ADO读取该字段时
值并未发生变化,将其值修改为如'2009-06-09 14:08:34.756',错误就出来了:提交数据时,ADO在
数据库进行匹配时取的条件却不再是'2009-06-09 14:08:33.756',似乎对其进行了四舍五入(因为我
将数据库的值改为'2009-06-09 14:08:33.750'后,就能正常修改保存,只要毫秒精确到了个位就不能
正常更新),所以断定是ADO的时间类型精度不够造成。
 
本人使用的是SQLITE本地数据库,出现同样问题,原因相同。
解决方法:
将类型转换为varchar. 例如,在SQL中,SELECT ID as ID, cast(ActTime as varchar) as ActTime, ...from TableA; 这样,在ADO提交修改时,对ActTime是以VARCHAR提交的,不再存在上述问题。

同样也试用了TDataSetProvider + TClientDataSet + ADOQuery 的方式,通过设置 UpdateMode = upWhereKeyOnly 以及 KeyField->ProviderFlags = TProviderFlags() << pfInKey , 修改可以写入数据库,但新问题出现:SQLITE对传入的时间格式解读有误,只保存了时间格式的日期部分,时分秒均为0。

最终,解决方法只能是将时间类型转换为字符串类型

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值