在jsp中捕获SQL RaiseError

时间:2015-05-11 12:22:20

标签: java sql sql-server jsp

我正在开发一个数据库和一些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()

2 个答案:

答案 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表触发器中存在的RAISERRORExceptionUtils.getRootCauseMessage(e)只会收到消息“交易在触发器中结束”。

到目前为止,我已经通过我的项目maven pom.xml文件加载了MSSQL驱动程序。 当我将MSSQL驱动程序放在JVM的jre / lib / ext文件夹中时,RAISERROR消息就包含在Java异常中。