gpt4 book ai didi

java - 从 SQL Server 存储过程引发 Java SQLException?

转载 作者:行者123 更新时间:2023-12-02 08:47:25 25 4
gpt4 key购买 nike

我有一个与此类似的 SQL Server 存储过程:

CREATE PROCEDURE proc1
(
@param DECIMAL
)
AS
BEGIN
INSERT INTO table1 (@param);
-- further commands
END;
GO

此过程是从 Java 调用的。我在上面插入的同一列上引入了对 table1 的唯一约束。如果违反约束,预计会在 Java 中收到 SQLException,但它没有发生。当从 SSMS 手动执行该过程时,我可以看到它打印了约束违反错误,然后继续执行该过程的其余部分,我认为这很奇怪,我预计它会失败。所以我把它改成这样:

CREATE PROCEDURE proc1
(
@param DECIMAL
)
AS
BEGIN
BEGIN TRY
INSERT INTO table1 (@param);
END TRY
BEGIN CATCH
THROW 51000, 'Unable to insert', 1;
END CATCH
-- further commands
END;
GO

现在,当我在 SSMS 中手动执行它时,该过程会在发生故障时停止,并打印我的错误消息。然而,Java 调用进程没有收到任何错误指示。如何将此错误传播到 Java 调用层?

更新:Java 调用层:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
String connectionUrl = "jdbc:sqlserver://x.x.x.x;database=x";

try (Connection conn = DriverManager.getConnection(connectionUrl, "x", "x")) {
try (CallableStatement stmt = conn.prepareCall("{call proc1(?)}")) {
stmt.setInt(1, 1);

stmt.execute();

System.out.println("Done");
}
}

最后,我可以看到“完成”消息打印到控制台。

最佳答案

添加SET NOCOUNT ON作为过程中的第一个语句来抑制 DONE_IN_PROC (rowcount) TDS 消息。否则,在客户端引发错误之前,代码将需要使用 ResultSetgetMoreResults 返回的所有结果。

关于java - 从 SQL Server 存储过程引发 Java SQLException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60987010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com