2012-08-28 22 views
1

不幸的是,我被推到了一个让我使用java来执行MS SQL Server中的某些存储过程的情况。发生异常时,我在SP中使用RAISEERROR命令。问题是java似乎无法捕捉到这些异常。 我的样品SP:Java可以处理由MS SQL Server RAISEERROR命令引起的异常吗?

ALTER PROCEDURE [dbo].[sp_test] 
    @fname nchar(30), 
    @lname nchar(30) 
AS 
BEGIN 

    BEGIN TRY 
     IF (@fname) = 'something' 
     BEGIN 
      RAISERROR (N'First name is not valid!',16,1, N'number', 5); 
      RETURN 
     END 
     Insert into [users] (
      [id] 
      ,[fname] 
      ,[lname] 
     ) 
     Values 
     (
      '1', 
      @fname, 
      @lname 
     ) 
    END TRY 
    BEGIN CATCH 

    END CATCH 
END 

我的Java代码:

try { 
       // Establish the connection. 
       Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
        con = DriverManager.getConnection(connectionUrl); 
        //------- Call a sp 
        String SPsql="EXEC sp_test ?,?"; //String SPsql="EXEC <sp_test> ?,?"; 
        PreparedStatement ps=con.prepareStatement(SPsql); 
        ps.setEscapeProcessing(true); 
        ps.setQueryTimeout(20); 
        ps.setString(1, "something"); 
        ps.setString(2, "12346"); 
        //ps.setString(parameterIndex, x) 
        ps.execute(); 

        } 
      } 
     catch (SQLException e) { 
      e.printStackTrace(); 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 

的SP被正常执行,但没有异常被捕获在java中!

那么,java可以处理这些异常吗?我在这里做错了什么?

+2

你吞咽的T-SQL代码中的例外。从“BEGIN CATCH ... END CATCH”块重新加注 –

回答

1

声明RAISERROR ..由于nchar(固定长度字符串)而未执行。将其更改为nvarchar

ALTER PROCEDURE [dbo].[sp_test] 
    @fname nvarchar(30), 
    @lname nvarchar(30) 
AS 
+0

非常感谢您的回复,但问题不在于此。无论如何,你所说的都很有用。 –

1

对不起球员是我不好,我忘了填写SP捕捉部分,所以把RAISEERROR有解决我的问题:

. 
. 
. 
    BEGIN CATCH 
     RAISERROR (N'ERROR OCCURED!!! %s %d.', 16, 1, N'number', 5); 
    END CATCH