SQL ServerのストアドプロシージャからのJavaのSQLExceptionを上げますか?

ガーボル主:

私は、このような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の呼び出し層にこのエラーを伝播することができますか?

UPDATE: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抑制するprocの中で最初の文としてDONE_IN_PROC(行数)TDSメッセージを。それ以外の場合は、コードが使用して返されたすべての結果を消費する必要がありますResultSetgetMoreResults、エラーがクライアントで発生する前に。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=389810&siteId=1