J'ai une procédure stockée SQL Server similaire à ceci:
CREATE PROCEDURE proc1
(
@param DECIMAL
)
AS
BEGIN
INSERT INTO table1 (@param);
-- further commands
END;
GO
Cette procédure est appelée à partir de Java. J'introduit une contrainte unique sur table1
, sur la même colonne qui est insérée au- dessus. Devrait obtenir un SQLException en Java en cas d'une violation de contrainte, mais il ne se produit pas. Lorsque la procédure est exécutée manuellement à partir SSMS, je peux voir qu'il imprime l'erreur de violation de contrainte, et continue ensuite sur le reste du processus, que je pense est bizarre, je m'y attendais à l' échec. Donc , je l' ai changé comme ceci:
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
Maintenant, quand je le faire manuellement dans SSMS, la procédure s'arrête en cas d'échec, et imprime mon message d'erreur. Cependant, le processus d'appel Java ne reçoit aucune indication de l'erreur. Comment puis-je propager cette erreur à la couche d'appeler Java?
MISE À JOUR: Java couche d'appel:
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");
}
}
A la fin, je peux voir le message « Terminé » imprimé à la console.
Ajouter SET NOCOUNT ON
comme première instruction du proc pour supprimer les DONE_IN_PROC
(rowcount) messages TDS. Dans le cas contraire, le code devra consommer tous les résultats retournés en utilisant un ResultSet
et getMoreResults
avant que l'erreur est soulevé sur le client.