不幸的是,我被迫使用 java 在 MS SQL Server 中执行一些存储过程。当发生异常时,我在 SP 中使用 RAISEERROR 命令。问题是java似乎无法捕获这些异常。 我的样本 SP:
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可以处理这类异常吗?我在这里做错了什么吗?
最佳答案
由于nchar
(固定长度字符串),语句RAISERROR ..
未执行。将其更改为 nvarchar
。
ALTER PROCEDURE [dbo].[sp_test]
@fname nvarchar(30),
@lname nvarchar(30)
AS
关于java - java可以处理由MS SQL Server RAISEERROR命令引起的异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12153823/