把你在EJB里update的SQL操作拿到外面去运行看是否有报错。

解决方案 »

  1.   

    YuLimin(阿敏总司令:简单就是美) 
    强!
      

  2.   

    这是EJB里的那个修改函数:  
    public void updateTransinfo2(String substaid, String lineid, String transid,
                                   BigDecimal voltagein, Timestamp usedate,
                                   String transname, String copyerid,
                                   Integer transtypeid, Integer usetype,
                                   Integer transcapa, Integer booknum,
                                   String transaddr, String producecompany,
                                   String producecode, Timestamp producedate,
                                   Integer nousedays, Integer compoint,
                                   BigDecimal rating) {    TransinfoPK pk = new TransinfoPK(substaid, lineid, transid);
        try {
          TransinfoRemote ejb = Transinfohome.findByPrimaryKey(pk);      ejb.setVoltagein(voltagein);
          ejb.setUsedate(usedate);      ejb.setTransname(transname);
          ejb.setCopyerid(copyerid);
          ejb.setTranstypeid(transtypeid);
          ejb.setUsetype(usetype);      ejb.setTranscapa(transcapa);      ejb.setTransaddr(transaddr);
          ejb.setProducecompany(producecompany);
          ejb.setProducecode(producecode);      ejb.setProducedate(producedate);
          ejb.setNousedays(nousedays);
          ejb.setCompoint(compoint);
          ejb.setRating(rating);
          ejb.setBooknum(booknum);    }
        catch (RemoteException ex) {
        }
        catch (FinderException ex) {
        }
      }这是我在JBUILDER里生成的测试端:
      public static void main(String[] args) {
        dyxxSessTestClient1 client = new dyxxSessTestClient1();
        dyxxSess test=client.create();    String substaid="01";   //变电站编号
        String lineid="3030";     //线路编号
        String transid="005";    //变压器编号
        BigDecimal  voltagein=new BigDecimal("36.1");  //输入端电压
        Timestamp usedate = Timestamp.valueOf("2005-11-11 15:14:18.999999911");//投运日期    String transname="33";     //变压器名称
        String copyerid="01";      //抄表员编号
        String charcomid="02";        //供电所编号
        Integer transtypeid=Integer.valueOf(1);  //变压器类型
        Integer usetype=Integer.valueOf(0);      //专用公用标志    Integer transcapa=Integer.valueOf(33);  //固定容量
        Integer booknum=Integer.valueOf(33);    //表本号
        String transaddr="33";      //安装地址
        String producecompany="33"; //生产厂家
        String producecode="33";    //出厂编号
        Timestamp producedate = Timestamp.valueOf("2005-08-08 15:14:18.999999911"); //出厂日期
        Integer nousedays=Integer.valueOf(33);      //运行天数
        Integer compoint=Integer.valueOf(0);
            BigDecimal rating=new BigDecimal("0.5555");
    //        BigDecimal rating=null;
            try {
              test.updateTransinfo2(
                  substaid, lineid, transid,
                  voltagein, usedate,
                  transname, copyerid, transtypeid,
                  usetype, transcapa,booknum
                  , transaddr,
                  producecompany, producecode,
                  producedate, nousedays, compoint, rating
                  );
            }
            catch (Exception ex) {
              ex.printStackTrace();
            }  }当我在EJB 的public void updateTransinfo2(..){..}里 把    ejb.setBooknum(booknum);这句话注释掉以后,运行整个测试端没有问题,其余的字段也能够修改。如果有这句话,在测试端就会报上面的错误。update transinfo set booknum=999 where substaid='01' and lineid='3030' and transid='001' 
    这是我在查询分析器里单独更改那个有触发器的字段,触发器是可以正常工作的还望高手赐教
      

  3.   


    去掉触发器就不报错了吗?确定?若是: 在触发器最后加上commit tran试试!
      

  4.   

    当然触发器前要加:
    begin tran
      

  5.   

    下面是那个触发器,
    单独在查询分析器里执行(就是更改那个有触发器的字段),触发器完全起作用,当我在EJB里,把那个与触发器有关系的语句(ejb.setBooknum(booknum);)注释掉,整个EJB 的程序是没有问题的
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GO
    /*创建修改变压器信息触发器*/
    ALTER   trigger T_update_trans 
    on transinfo
    for update
    as
    --停运变压器,由触发器维护停运信息表
    begin
      
      --修改变压器表本号,由触发器维护用户的表本号
      if update(booknum)
      begin
            begin tran trans1
            
       update userinfo set booknum = b.booknum
       from userinfo a,inserted b
       where a.substaid = b.substaid and a.lineid = b.lineid and a.transid = b.transid 
      
       commit tran trans1
      end
    end
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
      

  6.   

    我感觉好像与EJB 有关。
    JBossTransactionRolledbackException  这个异常可能是关键,我搜过关于这个异常,但是没有看懂相关的文章
      

  7.   

    update userinfo set userinfo.booknum = b.booknum
      from userinfo a,inserted b
      where a.substaid = b.substaid and a.lineid = b.lineid and a.transid = b.transid
      

  8.   

    检查触发器使用的字段参数,可能在现有或使用中,某一项是null
      

  9.   

    我如果在SQL 的查询分析器中更改那个字段(与触发器相关的字段)触发器的执行是正常的,不报任何错误,但在EJB 中运行就会报错
      

  10.   

    经有人指点,我的触发器改成如下:
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS ON 
    GOALTER   trigger T_update_transon transinfo
    for update
    as
    --停运变压器,由触发器维护停运信息表
    begin  if update(booknum)
      begin
       update userinfo set booknum = b.booknum
       from userinfo a,inserted b
       where a.substaid = b.substaid and a.lineid = b.lineid and a.transid = b.transid 
      end
    endGO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO另外,这个触发器所更改的 userinfo 表中,还有一个触发器,也是针对booknum 这个字段做了一个触发器