cds更新数据问题(100分)

  • 主题发起人 主题发起人 开心
  • 开始时间 开始时间

开心

Unregistered / Unconfirmed
GUEST, unregistred user!
SQL SERVER2000 + D7
三层结构(midas)中自动增量字段,在数据保存后如何自动更新到客户端CDS中
具体情况:
(主键为自动增量即前台不操作主键),
前台增加新记录数据成功后,不重新从数据库内取记录,再修改数据保存失败!!!错误提示“Record not found or changed by another user”(绝对没有其他用户操作数据)如刷新数据修改保存没有问题!!!
修改中间层Provider的POautorefresh 属性仍不能解决为什么!!!
 
在服务端将自动增加字段屏蔽掉
if DataSet.FindField('MEY') <> nil then
DataSet.FindField('MEY').ProviderFlags:= [pfHidden];
此处MEY字段为自动增加字段。
屏蔽后就提交时就不会受自动增加字段的影响,即在Provider更新数据时不会包括自动增加字段。
 
我 试了!!还是不行
 
改为:
if DataSet.FindField('MEY') <> nil then
begin
DataSet.FindField('MEY').ProviderFlags:= [pfHidden];
DataSet.FindField('MEY').Visible:= False;
end;
再试试,我遇到过这样情况,试验过可以的。
 
参与者一分!!!
谢谢mfksoft!!!
 
现在行否?
 
你可在sql 事件探查器中看到更新的sql 语句,如果你用了默认值,自增长值字段的话,那前后台数据可能会不一样,解决的办法是把这些值取回来更新,或者更新条件中设置providerFlag

 
说说我的个人看法:
一般来讲,设置AutoIncField的目的是为了保证数据的唯一性,也就是在这个表的数据有可
能重复情况下,我们增设这么个自动增值的字段,用以作为记录的唯一性区别. 有了这个自动
增值字段后,我们在作删除,修改记录时很方便.
但是,当我们新增一个记录时,由于自动增值记录的值是由数据库服务器决定的,所以在C/S
架构中,一般情况,也是无法获取该字段的最新值的,当然,利用ADO,作相应的设定,完全可以自动从服务器中获取.
而在三层架构中呢,是无法自动获取该字段的最新值的.我也曾经为此而冥思苦想过,后来
想出了一个不是办法的办法---ApplyUpdates后重新从服务器获取数据.虽然,表面上看起来,
这样的效率似乎不是很好,但,它也有它的好处----可以以关键字段更新,或者我们在中间层
自己写更新代码时,记录的定位也很方便(以自动增值字段定位),不是么?
 

第二次保存的时候!!事件探察器没有任何内容!!!
可见“Record not found or changed by another user” 是由中间层返回的.根本没到数据库层次!!!
那中间层是在什么时候!!什么事件检测的呢!!
to mfksoft
按你的方法可以解决一些问题!!但是还有几个顽固不化的!!!还是报错!!特别是巢状数据更新!!!
 
在保存成功后,你需要把客户端的数据集重新刷新一次,这样可以保证客户端的数据和数据库中的一致,代码可以如下:
if ClientDataset.ApplyUpdates(0)=0 then
ClientDataset.Refresh;
 
to 开心,
巢状数据更新(关键字Update,Delete)时服务端需要做事件对从表数据进行更新。
 
如果报“Record not found or changed by another user” 肯定不能执行ClientDataset.Refresh;
执行还是会报“Record not found or changed by another user”;
谢了!!!谢谢大家!!!
 
出现Record not found or changed by another user的错误是由于客户端的数据集和数据库中的数据不一致造成的。从你的描述来看,是新增数据后,再做修改后保存时出现的错误。当你第一次新增记录保存后,客户端记录的主键为空,而数据库中记录的主键由数据库自动生成了一个主键,由此造成了数据的不一致,所以我让你在每一次保存成功后,都调用ClientDataset.Refresh,使数据集保存一致,当然你也可以只在新增的保存后调用这个方法,我不知道我这样解释你是否明白
 
后退
顶部