SQL Server raiserror指令不会在java代码中引发异常

时间:2013-01-02 16:51:43

标签: java sql-server hibernate exception stored-procedures

我有一个存储过程,它执行多次更新/插入。我从Java客户端使用Hibernate调用它的执行。我希望这段代码在java中引发异常,如果过程会引发错误(例如,如果其中一个语句由于约束违规而失败)。相当简单,不是吗?

java代码如下所示:

getHibernateTemplate().execute(new HibernateCallback() {

        public Object doInHibernate(Session s) throws HibernateException, SQLException {
            SQLQuery query = s.createSQLQuery("exec myProc :date");                             
            query.setTimestamp("date", new Timestamp(valDate.getTime()));
            try {
                query.executeUpdate();
            } catch (HibernateException e) {  ...  } }

在程序中我插入此语句以模仿错误发生。

raiserror('this is bad', 11, 1);

如果这是第一个程序声明,它可以正常工作,所以如果我从mgmt studio调用它,输出看起来像这样:

  

消息50000,级别11,状态1,过程upd_position_list_hist,第85行   这很糟糕

Java代码捕获异常,一切正常。

但是,如果我将错误提升语句放在proc的中间 - 在它执行一些更新/插入之后 - 以便输出看起来像:

  

(0行(s)受影响)   (1排受影响)   (1排受影响)   消息50000,级别11,状态1,过程upd_position_list_hist,行   85这很糟糕

  • 这会停止在java端抛出异常。代码完成了执行,并且没有抛出任何HibernateException。可能是什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:1)

set nocount on应该解决这个问题,因为hibernate可能会在第一个结果之后停止读取结果,它不会期望来自单个查询的多个结果。

但是为什么你会首先使用hibernate来运行proc ..