java - 在jsp中捕获SQL Raiserror

标签 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 页面上写入 test 。

我总是收到此异常:>com.microsoft.sqlserver.jdbc.SQLServerException:该语句未返回结果集。

这是我正在执行的插入操作,如果我写入正确的值,它将毫无问题地插入。但即使它插入它也会抛出该异常。

编辑:我已经尝试过 u.getMessage()

最佳答案

您确实应该阅读收到的异常消息。
您没有从数据库获得异常的原因可能是因为它被从 java 获得的异常掩盖了。
我自己就是一个 .net 人,我上次使用 java 大约是 17 年前,所以我不熟悉应该使用的正确方法,但它可能不是 executeQuery .
According to this post ,您应该使用 execute 来代替。

更新
在我们在评论中交谈之后,我进行了一些挖掘并发现 this pearl in MSDN.
注意这部分:

A RAISERROR severity of 11 to 19 executed in the TRY block of a TRY…CATCH construct causes control to transfer to the associated CATCH block. Specify a severity of 10 or lower to return messages using RAISERROR without invoking a CATCH block.

这意味着您的 raiseerror 的严重性参数应该在 11 到 19 的范围内。

关于java - 在jsp中捕获SQL Raiserror,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30167527/

相关文章:

Java定时器: Terminating under weird circumstances,解释?

php mysql 选择列并与不同表中的3个值进行比较

sql - 是否可以在 postgres 11.x 中创建小整数的 ENUM?

php - 返回多个结果的不同 SQL 查询

sql - 选择两列中两个日期之间的记录

.net - 如何将 RUNAS/NETONLY 功能构建到 (C#/.NET/WinForms) 程序中?

java - 树的左 View 或右 View

java - 在 Java 中跳过 For 循环中的迭代

sql - postgres 连接查询

java - 运行集成测试时,Maven Shade 插件会导致类路径上出现重复的 jar