【问题标题】:Catch SQL RaiseError in jsp在 jsp 中捕获 SQL RaiseError
【发布时间】:2015-07-21 22:46:36
【问题描述】:

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

【问题讨论】:

  • 您好,您是否检查过当您插入正确的值时这些值是否存储在数据库中?
  • 嘿,是的,我检查过了。我直接去了 SQL Server 并选择了整个表。价值观就在那里。这就是为什么我觉得这很奇怪。

标签: java sql sql-server jsp


【解决方案1】:

你真的应该阅读你收到的异常信息。
您没有从数据库中获取异常的原因可能是因为它被您从 java 中获取的异常所掩盖。
我自己是一个 .net 人,我上一次使用 java 大约是 17 年前,所以我不熟悉你应该使用的正确方法,但它可能不是executeQuery
@ 987654321@,你应该改用execute

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

在 TRY…CATCH 构造的 TRY 块中执行 11 到 19 的 RAISERROR 严重性会导致控制转移到关联的 CATCH 块。指定 10 或更低的严重性以使用 RAISERROR 返回消息而不调用 CATCH 块。

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

【讨论】:

  • 我试过了,它说:类型不匹配:无法从布尔值转换为结果集。我阅读并用谷歌搜索了另一个例外,但找不到任何东西,这就是我在这里发布的原因:S
  • 我已经用谷歌搜索了这个异常,它返回一个布尔值。作为需要返回的结果集,我不能使用该语句。
  • 如果是插入语句,它不会产生结果集。因此,您需要将 rs = stmt.executeQuery(sql); 更改为 Success = stmt.executeQuery(sql);,其中 Success 是一个布尔变量,它将告诉您插入是否成功。
  • 你的存储过程里面有select语句和insert语句吗?
  • 它确实有一个插入语句。所以如果我成功插入一行,它应该找到一个结果集吗?但是,它没有选择语句。但是 RAISERROR 关键字不应该像 JAVA 中的 Throw Exception 那样工作吗??
【解决方案2】:

我在我的一个 Spring Boot 项目中遇到了这个问题。抛出的异常不会包含 MSSQL 表的触发器中存在的 RAISERRORExceptionUtils.getRootCauseMessage(e) 只会收到消息“事务在触发器中结束”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    相关资源
    最近更新 更多