更新保存显示” Update affected more than 1 record.”(100分)

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

leo528713

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序采用DCOM三层结构,客户端在更新保存时显示
” Update affected more than 1 record.”.程序服务器端的TDataSetProvider的
ResolveToDataSet设为False,我可以确认只有我一个人在操作,并且数据表中主键也设置
无误,各种选项都试过了,相同设置的其它表可以正常操作,但是这一个就是不行.我尝试用
SQL Profiler跟踪了一下,其过程如下:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SET FMTONLY ON select pass,
id from Pchuku_h SET FMTONLY OFF
set implicit_transactions on SET NO_BROWSETABLE OFF
declare @P1 int
set @P1=1
exec sp_prepare @P1 output, N'@P1 bit,@P2 char(10)', N'update Pchuku_h set
pass = @P1
where
id = @P2
', 1
select @P1
exec sp_unprepare 1
exec sp_executesql N'update Pchuku_h set
pass = @P1
where
id = @P2
', N'@P1 bit,@P2 char(10)', 1, 'PC00000001'
SET FMTONLY ON select
id from Pchuku_h SET FMTONLY OFF
declare @P1 int
set @P1=2
exec sp_prepare @P1 output, N'@P1 char(10)', N'select
id,
orderid,
recorddate,
sendate,
record,
send,
checkman,
pass,
modify,
reason
from Pchuku_h
where
id = @P1
', 1
select @P1
exec sp_unprepare 2
exec sp_executesql N'select
id,
orderid,
recorddate,
sendate,
record,
send,
checkman,
pass,
modify,
reason
from Pchuku_h
where
id = @P1
', N'@P1 char(10)', 'PC00000001'
IF @@TRANCOUNT > 0 ROLLBACK TRAN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
请各位高手不吝赐教!
 
很明显这个表中有两个相同的ID,设了主关键字并不代表不重复,
还要设簇索引才行。
 
这个问题好像不是有两个相同的Id,
大概是有几条完全相同的记录,三层他的更新是比较整体记录的
有效办法是为这种表建一个主键
 
你用的是ADODATASET吧,我遇到过,是你的操作影响了过多的行,
也就是说应该一次只操作一行。
改成TADOQUERY用SQL执行就好了。
 
首先在此谢谢各位,哈利波特的答案我没办法看到,所以也没办法评估,其余三位的答案都没
办法解决我的问题,因为我的表中只有一条记录,而且我也设了主键等等,照理讲根本就不可
能出现以上错误,但是不知道到底是哪里出错了,还望各位高手再指点
 
将你的该段源程序贴出来看一下吧,这样确实不好判断
 
没有什幺好贴的,因为我在客户端只有一句If Master(指主表).ChangeCount>0 then

Master.ApplyUpdates(0),我采用了Master/Detail结构.服务器端我不是用TADODataSet
更新的,而是直接更新回数据库,也就是TdataSetProvider的ResolveToDataSet设为False.
 
你可以试一下以下方法
1、补丁装齐(我想应该是装了)
2、去掉主从关系,直接更新主表,看是否有错误,如果没有错误,则是从表
更新出错,或是主从表关系没有建对,如果还是出错,则只检查主表。
调试程序是件很费力的事情,一定要多试几种方法,肯定会成功的。
 
以上诸位仁兄的方案都试过了,但是还是于事无补.
问题怪就怪在其它几个表可以,只有这个表出问题.
 
如果去掉主从关系都还不行,
你再看一下数据库是否设有触发器或表间约束,如果有,先去掉了再试。
 
你所讲的我都试过了,无论数据库方面还是程序方式.再者,你有QQ或其它的联络办法,
可以让我直接请教,我在此先谢过了
 
我查了一下这条信息的出处,来自datasetprovider
procedure TSQLResolver.DoExecSQL(SQL: TStringList;
Params: TParams);
var
RowsAffected: Integer;
begin
RowsAffected := IProviderSupport(Provider.DataSet).PSExecuteStatement(SQL.Text, Params);
if not (poAllowMultiRecordUpdates in Provider.Options) and (RowsAffected > 1) then
DatabaseError(STooManyRecordsModified);
if RowsAffected < 1 then
DatabaseError(SRecordChanged);
end;
从上面可以看出,当rowsaffected>1时就会出现这条错误信息,但你的数据库只有一
条记录,这确让人非常奇怪,可再试一下以下方法
1、将resovetodataset设为true,也就是不通过datasetprovider提交数据,看
提示信息。
2、直接用sql语句进行修改,看提示信息,如修改了多少行等
如果还未找到原因,则直接用C/S结构进行修改,看是否有错误发生,没有,则
客户端有问题,有则多半是数据库的问题
 
将服务器端的TDataSetProvider的poAllowMultiRecordUpdates改为true 就可以了
 
hehe,如果你插入的记录跟原表中有的记录完全一样或原表中有完全一样的记录你修改其中一条时就会发生这样的错误。(没有设置关键詞)
 
heyifu
我将服务器端的TDataSetProvider的poAllowMultiRecordUpdates改为true,问题已经解决.
谢谢!但我还是不明白为什幺相同结构的表,其它的表不经过这一步更新数据不会出错,而只
有这个表会出现这个错误(我的表中只有一条记录).希望大家讨论讨论,是不是Delphi还有
什幺未为人知的Bug
 
顶部