0

我有一个存储过程,它执行几个更新/插入。我使用来自 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 行受影响)(1 行受影响)(1 行受影响)消息 50000,级别 11,状态 1,过程 upd_position_list_hist,第 85 行,这很糟糕

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

1 回答 1

1

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

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

于 2013-03-12T12:09:59.917 回答