为什么我的程序总是出现'无法为更新行集定位一些值可能已在最后读取后改变'这样的提示!(150分)

  • 主题发起人 主题发起人 lsan78
  • 开始时间 开始时间
L

lsan78

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么我的程序总是出现'无法为更新行集定位一些值可能已在最后读取后改变'这样的提示!
还有当我的表中有两条相同的记录时,当我删除其中的一条(在WWDBGRID中)就会出现:"键列信息不足
或不正确更新影响到过多的行"这样的错误,然后会把相同的记录全部删除,
这会不会与我所用的控件有关,我用的是IP3000的数据库控件!请各位大虾帮忙!急!
 
这是你操作表出现了问题,与控件无关的
 
在线等待,请各位高手出手相助
 
你的表应该有主键,不然很容易出现这样的情况
 
在表中定义一个主键,ADO连接方式需要主键来定位纪录。
 
按两位的,我试了一下,第二个问题没有了,可是第一个问题还是存在.
 
还是主键的问题,这两种情况我这两天都遇上过,如果你是用ADOQuery的话,在SQL查询时
要加上主键,如果你操作的是DBF数据库还是要先建索引。
 
我的SQL语句都是SELCET * FROM TABLE1,用的是ACCESS2000
 
我刚看了自己以前的程序,发现是是数据库的默认值在作怪,在绑定控件自动更新时,
数据库有些字段的默认值就更新到了数据库中,而绑定控件没有刷新造成以上错误。
解决方法:去掉数据库中的默认值即可。另外一点是数据库中少做约束,充许空设为TRUE
必填字段设为FALSE,如一定要做约束,就在程序中做。这样可以减少很多意外错误!
 
我刚才试过将游标改为crUseServer也不会出现这种情况,请解释原因,多谢了
 
crUseServer是在表里操作,当然不会出错了
 
是d5吗?升级ado补丁。
 
dodo说的没错,把默认值取消就可以了。
 
ADO补丁我也升级了,但楼主的两个问题我仍会遇上,看来还是ADO的BUG了,另外ADO的速度
好象并不如人意。
 
是由于ADO进行(默认)更新操作时会将全部字段作为定位的标志,故若数据表打开之后
到更新操作这段时间内若数据表内的内容被其他操作更改了,而这时你再进行更改操作就
会出现你现在这种情况!
解决方法以下:
在open数据集之后设置ADO的属性'Update Criteria'有值为$00000000即可
uses ADOINT;
Adoquery1.Recordset.Properties['Update Criteria'].Value:=adCriteriaKey;
 
'无法为更新行集定位一些值可能已在最后读取后改变'
这个问题应该是被讨论很多次了,其实它不关构件事,不关数据库的事,只是你的程序有
问题而已,不管是BDE还是ADO,在数据更新时,它都会转换成SQL语句与后台的数据库打
交道,例如一个更新操作,当你在客户端修改了一些数据,而后Post的时候,BDE或者ADO
这些数据引擎会生成类似的语句:'Update tablename set field1=*** where ....',问题
的关键在于where子句,在BDE中是根据ttable的Updatemode属性控制怎样生成where子句的
而在Ado中是利用TField的ProvideFlag属性来控制,如果你的客户端程序没有注意到这些
问题的话,就很可能导致上面的错误。例如你在数据库定义时设置了字段A的默认值,而你
在客户端新增一条纪录时没有对字段A赋值,这样你在客户端缓冲中的数据就与数据库中的
不同了,当你下次再对该条纪录更新时,问题就来了,where子句中A的值就会根据客户端
赋为空,这样就会导致根据where子句定位不到数据库中的纪录,而Delphi就会认为这可能
是由于你在从数据库取下数据到你发出Post命令之间可能有另外的人更改了该条纪录
 
多谢各位大虾了!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部