【问题标题】:java is not catching ms sql stored procedure raise errorjava没有捕获ms sql存储过程引发错误
【发布时间】:2012-10-20 14:17:50
【问题描述】:

我的 SQL Server 2008 数据库中有一个存储过程,我正在开发一个使用 sqljdbc4 连接的 Java 应用程序。一切正常,即使是过程调用,但有一件事 - 在某些情况下,java 不会捕获过程抛出的引发异常,并在调用时指定,例如选择或更新(删除插入)

这是一个例子

AS
BEGIN
    DECLARE @c INT
    SELECT @c= COUNT(nomUtilisateur) 
        FROM Utilisateur2
    PRINT @c
    RAISERROR(N'error message personalise',18,1)
END

在这种情况下,java 会捕获异常

try{
    CallableStatement cll=con.prepareCall("EXEC f3 ");
    cll.execute();

    System.out.println("fin EXEC f3 ? ");}
catch (SQLException e) {
    System.out.println("sqlerror state: "+e.getSQLState() +" |error code: "
        + e.getErrorCode()+" |message: "+e.getMessage());
    e.printStackTrace();
} 

但是当我使用这样的选择时


ALTER PROCEDURE [dbo].[f3]
AS
BEGIN
    declare @c INT
    SELECT @c= COUNT(nomUtilisateur) 
        FROM Utilisateur2
    select * from Utilisateur2
    PRINT @c
    RAISERROR(N'error message personalise',18,1)
END

或更新,java 继续执行而不捕获异常。就像它不等待程序结束一样。

所以我的问题是,我是否错误地使用了存储过程,或者它是 jdbc 驱动程序中的一个错误,还是它更喜欢使用 out 参数并离开这个策略;我用谷歌搜索了这个问题,没有找到任何东西。

就个人而言,我想使用引发的错误

【问题讨论】:

  • 这行:**select * from Utilisateur2** 应该是什么意思?它不是有效的 SQL 语法 AFAIK,我无法在我的任何 SQL Server 中编译此过程。
  • 这纯粹是一个猜测,但是java是在解释存储过程的返回值吗?如果你在 raiseerror 后面加上一个“return 1”呢?

标签: java sql-server stored-procedures try-catch raiserror


【解决方案1】:

试试去掉 PRINT 语句,在 proc 的代码中加上“SET NOCOUNT ON”,可能是驱动搞糊涂了。

【讨论】:

  • 非常感谢您,我很想找到一些东西来禁用请求完成的默认打印,并且
  • 不幸的是,@Lion 网站只允许每月更改一次名称。但重点。
  • 如果您通过调用 getResultSet() 然后在结果集上调用 next() 来遍历结果集,那么即使您没有“set nocout on”,在我的经验中也会抛出异常。在我看来,set nocount on solution 是有风险的,因为它很容易出错。
猜你喜欢
  • 2014-11-27
  • 2018-03-20
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 2011-11-07
  • 1970-01-01
相关资源
最近更新 更多