ガーボル主:
私は、このような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メッセージを。それ以外の場合は、コードが使用して返されたすべての結果を消費する必要がありますResultSet
とgetMoreResults
、エラーがクライアントで発生する前に。