两条记录内容一样,为什么无法实现对其中一条的修改?(200分)

  • 主题发起人 主题发起人 cxcsy
  • 开始时间 开始时间
C

cxcsy

Unregistered / Unconfirmed
GUEST, unregistred user!
三层模式ado+sqlserver2000
adoquery有两条记录内容一样(id除外),
a1 a2 id
1 'c' 1
1 'c' 2
id是主键KEY,现在想对第一条的a1改为2,applyupdate(0)之后提示错误
提示错误"有多于一条记录被修改"(中间服务器的datasetprovider的updatemode设置是
upwherechanged)
或提示错误"记录不存在或被他人修改"(中间服务器的datasetprovider的updatemode
设置是upwhereall)
或提示错误"key不存在"(中间服务器的datasetprovider的updatemode设置是
upwherekeyonly)
请问有什么办法使用adoquery实现对其中一条的修改?
如果用adotable没有问题.
 
update 表 set a1=2 where id=1
这样不行吗?不可能呀。
 
请问你的这条记录是怎么形成的?
如果不知道就惨了,SQL好像有BUG
 
因为我使用adoquery下载数据,使用applyupdate(0)修改数据非常方便,
如果两条记录的数据内容不完全相同,数据修改是没有问题的。
 
查询时把 id 包含进去!
 
已经包含select * from table1
 
还是用sql好
 
数据库都被你给玩坏了,你还在这搞什么啊你,,你见过这样得数据还能正常运行程序得
吗?这肯定是你用insert语句强行搞进去得吧。。只有delete * 了。。惨啊
 
只有SQL语句最好用而且要做好事务处理
 
可能大家理解错误,我的数据如下:
a1 a2 id
1 c 1
1 c 2
2 a 3
......
数据库没有问题!比如某商品,同一时间购入两批相同价格数量的物品,销售时
我只能从其中的一批商品上减数量,应该没错吧!
 
你修改的数据集中肯定没有包含主键(字段id),所以提交修改时数据库只能通过其它几个
字段
a1 a2
1 'c'
1 'c'
去定位记录,这样就得到两条记录
a1 a2 id
1 'c' 1
1 'c' 2
数据库不能确定该修改哪一条记录,所以就会有错误提示了。

解决办法:把id字段包含到待修改数据集中。
 
另:直接用SQL语句来修改也是一样:必须通过主键来定位记录。
 
ado的SQL为select * from table1
 
如果使用update 定位修改,我就不来问各位大虾了,就想使用applyupdate()来实现!
clientdataset1.open;
clientdataset1.edit;
clientdataset1['a1']:=2;
clientdataset1.applyupdate(0);
 
clientdataset1.open;
if clientdataset.locate('id','2',[]) then //如果修改的id是2
clientdataset1.edit;
clientdataset1['a1']:=2;
clientdataset1.applyupdate(-1);
 
先定位,再修改!
 
加入主键索引就行!
更改时包含主键!
 
没有主索引的数据库都会出现
可以删除两条记录,可能要用delete了
 
clientdataset1和adoquery无法设置主键(key),如果能够设置主键问题就解决了,
在数据库中ID本来解释主键,但程序中不能设置
 

Similar threads

D
回复
0
查看
867
DelphiTeacher的专栏
D
D
回复
0
查看
836
DelphiTeacher的专栏
D
D
回复
0
查看
785
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部