现是一个表结构为:   F  a    b   sum
                    1  5    8    13
                    2  6    6    12
触发器:tr_id(当insert、update数据时自动更新记录sum=a+b)
F是主键
在SQL SERVER数据库没有问题,能自动更新数据.而在delphi中就有问题.我的adodataset1设置为批量更新,添加没有问题.就是用adodateset1.updatebatch;就出现"键列信息不正确或键值不足,更新影响到多行.

解决方案 »

  1.   

    在SQL SERVER中可以,只要insert、update就可以触发
      

  2.   

    看数据是否已经正常更新了?如果更新了屏蔽此错误(在ADO错误时间处理中)。
      

  3.   

    在Provider中的写法
    if E.Message='键列信息不足或不正确。更新影响到过多的行。' then
          Response:=rrIgnore在ADO中参照去写
      

  4.   

    要看你得触发器怎么写啊!晕!你们别在乱猜了!晕!目前这个提示当然是提示所说得,触发器影响到多行!你这里是批更新!而不是逐个添加!在SQL查询分析器里面如果涉及到多行的话也提示这个问题!首先要判断你的触发器如何写!
      

  5.   

    楼上的说的很对,的确我的更新多条记录因为可能你要update数据,而不既是insert啊.
    ==========================
    CREATE TABLE [dbo].[proid_code] (
    [letter] [char] (3) COLLATE Chinese_PRC_CI_AS NULL ,
    [sign] [char] (1) COLLATE Chinese_PRC_CI_AS NULL ,
    [number] [int] NULL ,
    [sort] [char] (12) COLLATE Chinese_PRC_CI_AS NULL ,
    [codeid] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
    [num] [int] IDENTITY (1, 1) NOT NULL 
    ) ON [PRIMARY]
    GO
    ====================================================================
    create trigger tr_proid_code on proid_code
    for insert,update
    as  update proid_code set codeid=rtrim([letter])+rtrim(isnull([sign],''))+
                                   (case 
                                     when len(number)=1 then  '000'+cast([number] as char(4)) 
                                     when len(number)=2 then  '00'+cast([number] as char(4))
                                     when len(number)=3 then  '0'+cast([number] as char(4))
                                     when len(number)=4 then cast([number] as char(4))
                                     end)
      

  6.   

    你在PostError中屏蔽掉就可以了啊,怎么还没解决啊
      

  7.   

    thanks,你的关心
    光标停在Response:=rrIgnore这里。是哪一个单元,response
      

  8.   

    你在ADO中要用Action:=daAbort
    我上面说的是在Provider中
      

  9.   

    一样用action:=daabort中断了。trigger也不触发了
      

  10.   

    没有啊大哥,我觉得" kfarvid(永远爱着一个叫"傲"的女孩)"说的根想的一样,但不知如何是从?
      

  11.   

    1、触发器,不应该这样写
    2、这个问题,不应该用触发器来写,
    在建表的时候,codeid=rtrim([letter])+rtrim(isnull([sign],''))+right('0000'+number的字符串,你的长度)
    就可以了,不用触发器
      

  12.   

    help me啊。老大,还是不行啊
      

  13.   

    lwk_hlj(阿凯(CSDN第一铁公鸡横空出世)),大佬,帮助改一下,好吗?
      

  14.   

    update proid_code set codeid=rtrim([letter])+rtrim(isnull([sign],''))+
                                   (case 
                                     when len(number)=1 then  '000'+cast([number] as char(4)) 
                                     when len(number)=2 then  '00'+cast([number] as char(4))
                                     when len(number)=3 then  '0'+cast([number] as char(4))
                                     when len(number)=4 then cast([number] as char(4))
                                     end)
    where  你的自增字段=inserted.你的自增字段就OK了。
      

  15.   

    create Trigger XXXXXX
    on SvcOrder after update
    as 
    begin
        IF  @@RoWcount = 0 return
        SET NOCOUNT ON  --加這句
      ....     SET NOCOUNT OFF --加這句
      

  16.   

    同意,hmily1688(没什么好说的)
    这个是因为批量更新的时候,导致的错误 。
    由于你的出发器不具备条件,所以他们回修改所有的数据。
    重而导致数据库数据和ado中的数据不一致,所以引发了问题。
    如果不是特别必要建议你使用where 语句
      

  17.   

    1 直接把sum字段设置为公式字段不就结了,不需要用trigger
    2 我觉得你的问题可能并不在这里,而是由于你的自增长字段批量插入时候的问题。如果你要用自增长字段,建议减少批量修改和并发操作。
      

  18.   

    个人觉得: hmily1688(没什么好说的)+dobetterthatnthink(饥不择食) 应该解决这个错误了,原因饥不择食说得很清楚了
      

  19.   

    1 直接把sum字段设置为公式字段不就结了,不需要用trigger难道你不知道有个字符串操作吗?
    rtrim([letter])+rtrim(isnull([sign],''))+right('0000'+cast(Number),4)
      

  20.   

    我以前遇到这种问题,主要在于使用批量处理方面。在前台用WHILE语句一条一条更新
      

  21.   

    俺也觉得没必要用trigger啊
    不就计算个总和不?在你的代码里面自动计算再加进去,何必加大数据库服务器的负担呢??