我正在开发一个数据库和一些JSP页面来对其执行CRUD操作。
我无法在JSP代码中捕获与我的SQL代码相关的异常。
例如:
我有这部分代码,我在T-SQL中引发错误:
IF @existing > 0
BEGIN
RAISERROR ('ID primário ja existe', 1, 1)
RETURN 0
END
IF (@CategoriaId IS NULL)
BEGIN
RAISERROR('O CategoriaId não pode ser nulo',1,1)
RETURN 0
END
我需要调用我在JSP代码中引发这些错误的函数。
这是JSP代码的一部分:
try
{
rs = stmt.executeQuery(sql);
}
catch (Exception u)
{
out.println(u.toString());
}
它永远不会从T-SQL返回错误。
但是我知道函数到达catch语句,因为如果我在那里抛出println(“test”),它会在jsp页面上编写测试。
我总是遇到此异常:> com.microsoft.sqlserver.jdbc.SQLServerException:该语句未返回结果集。
这是我正在进行的插入操作,如果我写了正确的值,它会毫无问题地插入。但即使它插入它也会引发异常。
编辑:我已经尝试了u.getMessage()
答案 0 :(得分:1)
你真的应该阅读你得到的异常消息。
你没有从数据库中获取异常的原因可能是因为你从java获得的异常掩盖了它。
我自己,我上次与java合作的时间大约是17年前,所以我不熟悉你应该使用的正确方法,但它可能是不是executeQuery
According to this post,您应该使用execute
。
<强>更新强>
在我们在评论中进行了对话之后,我进行了一些挖掘并找到了this pearl in MSDN.
请注意这一部分:
在TRY ... CATCH构造的TRY块中执行的RAISERROR严重性为11到19会导致控制转移到相关的CATCH块。指定严重性为10或更低,以使用RAISERROR返回消息而不调用CATCH块。
这意味着您的raiserror
严重性参数应介于11到19之间。
答案 1 :(得分:0)
我在我的Spring Boot项目中为此苦苦挣扎。抛出的异常将不包含MSSQL表触发器中存在的RAISERROR
。 ExceptionUtils.getRootCauseMessage(e)
只会收到消息“交易在触发器中结束”。
到目前为止,我已经通过我的项目maven pom.xml文件加载了MSSQL驱动程序。
当我将MSSQL驱动程序放在JVM的jre / lib / ext文件夹中时,RAISERROR
消息就包含在Java异常中。