Clientdataset.ApplyUpdates 的问题求助

 

转自:http://www.skinplusplus.com/bbs/archiver/tid-115515.html

 

覆雨翻云 发表于 2010-5-29 14:14

Clientdataset.ApplyUpdates 的问题求助

我调用Clientdataset.ApplyUpdates,出现record   not   found   or   changed   by   another   user。
       具体操作如下:先Clientdataset.insert;Clientdataset.ApplyUpdates
       但当我再Clientdataset.edit,Clientdataset.ApplyUpdates时就出错了。

tianya.cn 发表于 2010-5-29 14:14

我使用Sql   Server   数据库更新多条记录   没有问题;
  
但是使用   Oracle   就不能同时更新多条记录就报
“record   not   found   or   changed   by   another   user。

这样的错误。
真奇怪,难道   ClientDataSet不能很好的支持Oracle   ?

pbuilder 发表于 2010-5-29 14:14

我使用Sql   Server   数据库更新多条记录   没有问题;
  
但是使用   Oracle   就不能同时更新多条记录就报
“record   not   found   or   changed   by   another   user。

这样的错误。
真奇怪,难道   ClientDataSet不能很好的支持Oracle   ?

su7en 发表于 2010-5-29 14:14

你好,我用sql   server的,但我先Clientdataset.edit,然后写更新的数据自己段,最后Clientdataset.ApplyUpdates,结果也出错了,不过,我在别的窗口实现同样的功能没有出错,不知道为什么这个就是出错了,但有时候又可以更新的,但现在就是不能更新的!
数据库的数据库没有变化!!
请高手指教,我的QQ:89399727
msn:yangshanyin@msn.com

tianya.cn 发表于 2010-5-29 14:14

不要有自增字段      任何字段不要有默认值

追无极 发表于 2010-5-29 14:14

自增字段对数据更新有什么影响的哦?
请高手说清楚点哦!!

tianya.cn 发表于 2010-5-29 14:14

如果一条记录的ID是自增字段,那么客户端不知道它下一个数值应该是几,只有提交到服务器才知道,你APPEND后再POST,客户端认为ID=NULL,服务端收到请求把记录APPEND到数据库,数据库给ID正确的值,比如是1,客户端这时EDIT并POST,这

wentianxiang 发表于 2010-5-29 14:14

不小心提交了-_-
  
  
续上
  
这时它会提交两条数据,一条是修改前的,一条是修改后的,服务端收到请求更新,会先对比修改前的与数据库中的是否一致,这样为了防止多用户操作时出现问题,但现在客户端提交的数据中修改前的ID为NULL,数据库中实际为1,就会出错了

pbuilder 发表于 2010-5-29 14:14

这个问题可以看一下UpdateMode的属性设置说明。
一般时候多为表中含有时间类型的字段   通过Delphi程序获得的时间后面有毫秒部分,而这样存到
数据库中后,再通过cds取出来的时候数据就把毫秒的那部分取消了。当UpdateMode的属性设置为upWhereAll   就会报错了。

成吉思汉 发表于 2010-5-29 14:14

非常感谢MoveFirst
我也遇到过这样的问题,一值都不敢用SQL语句更新,就是因为这个问题
现在解决了,总算见到阳光了

<think>嗯,用户的问题是关于Delphi或Pascal中ClientDataSet操作字段的用法,特别是FieldByName和AsFloat的使用示例。首先,我需要回顾一下ClientDataSet的基本操作,确保自己理解正确。根据引用[2],ClientDataSet的优点是不需要BDE,支持本地内存副本,操作速度快,而且可以关联远程数据源。 用户提到FieldByName和AsFloat,这应该涉及到如何访问特定字段并处理浮点数数据。FieldByName是TDataSet的方法,用于通过字段名获取字段对象,而AsFloat则是用于获取或设置浮点数值的属性。需要确认的是,正确的语法和用法,比如是否需要处理异常,或者是否有更安全的方法。 接下来,我应该先提供一个简单的示例代码,展示如何使用FieldByName和AsFloat。例如,读取或设置某个字段的值。同时,可能需要提到异常处理,因为如果字段不存在,FieldByName会抛出异常,所以使用前最好检查字段是否存在,或者使用FindField方法替代。 另外,引用[1]中的例子使用了DataSet.FieldByName('name').AsString,这可以作为一个参考,用户可能需要类似的结构来处理浮点数字段。比如,在赋值时直接使用AsFloat,或者在条件判断中使用。不过用户的问题更偏向于如何使用,所以示例代码应该清晰展示赋值和读取的过程。 还需要注意数据类型匹配的问题,如果字段不是浮点类型,使用AsFloat可能会导致错误。因此,在示例中可能需要强调确保字段的DataType正确,比如ftFloat或相关的数值类型。此外,可以提到在ClientDataSet中定义字段时,DataType的设置,如引用[2]中提到的FieldDefs的配置,这有助于用户正确创建字段结构。 用户可能在实际使用中遇到字段不存在或类型不匹配的问题,所以建议添加异常处理或检查。例如,使用Try..Except块来捕获EDatabaseError,或者先检查FieldByName返回的字段是否为nil。不过在Delphi中,FieldByName如果找不到字段会直接引发异常,所以异常处理是必要的。 此外,可能还需要对比其他方法,比如使用字段对象变量(如ClientDataSet1FieldName)来访问,这样更高效且安全,避免运行时错误。但用户的问题明确提到FieldByName,所以重点应放在这个方法上。 最后,总结使用步骤,强调关键点,比如确保字段存在、类型正确,以及异常处理的重要性。同时,生成的相关问题应该覆盖常见的操作,比如添加字段、处理其他数据类型,以及异常处理的最佳实践。</think>在Delphi中,使用$ClientDataSet.FieldByName().AsFloat$操作浮点数字段时,需要注意以下要点和示例: ### 一、基础用法 ```pascal // 读取字段值 var dValue: Double; begin dValue := ClientDataSet1.FieldByName('Price').AsFloat; end; // 写入字段值 begin ClientDataSet1.Edit; ClientDataSet1.FieldByName('Discount').AsFloat := 0.85; ClientDataSet1.Post; end; ``` **说明**: 1. 必须确保字段名'Price'和'Discount'已通过$FieldDefs$定义(引用[2]) 2. 操作前需进入$Edit$模式,修改后调用$Post$提交 ### 二、安全操作建议 ```pascal // 推荐添加异常处理 try if ClientDataSet1.Locate('ProductID', 100, []) then ShowMessage(FloatToStr(ClientDataSet1.FieldByName('Weight').AsFloat)); except on E: EDatabaseError do ShowMessage('字段操作错误: ' + E.Mess
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值