Java 它不会捕获存储过程Spring Boot的错误
我有一个raiserror程序,spring没有发现我的错误,或者可能我做错了什么。我留下密码 程序Java 它不会捕获存储过程Spring Boot的错误,java,json,spring-boot,stored-procedures,sql-server-2017,Java,Json,Spring Boot,Stored Procedures,Sql Server 2017,我有一个raiserror程序,spring没有发现我的错误,或者可能我做错了什么。我留下密码 程序 ALTER PROC [dbo].[SP_CRUD_USERS] @OPCION INT = 0, @NOM_USER VARCHAR(50) = NULL, @EMA_USER VARCHAR(50) = NULL, @COD_USER INT = 0 AS BEGIN SET NOCOUNT ON BEGIN TRY IF @OPCION = 1
ALTER PROC [dbo].[SP_CRUD_USERS]
@OPCION INT = 0,
@NOM_USER VARCHAR(50) = NULL,
@EMA_USER VARCHAR(50) = NULL,
@COD_USER INT = 0
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
IF @OPCION = 1
BEGIN
SELECT * FROM TB_USERS
END
ELSE IF @OPCION = 2
BEGIN
IF NOT EXISTS (SELECT * FROM TB_USERS WHERE EMA_USER = @EMA_USER)
BEGIN
IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
RAISERROR('Ingresar un dato para registrar',16,1)
ELSE
INSERT INTO TB_USERS VALUES (@NOM_USER, @EMA_USER)
END
ELSE
RAISERROR('El email ya existe',16,1)
END
ELSE IF @OPCION = 3
BEGIN
IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
BEGIN
IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
RAISERROR('Ingresar un dato para actualizar',16,1)
ELSE
UPDATE TB_USERS SET NOM_USER = @NOM_USER, EMA_USER = @EMA_USER WHERE COD_USER = @COD_USER
END
ELSE
RAISERROR('El usuario no existe',16,1)
END
ELSE IF @OPCION = 4
BEGIN
IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
DELETE FROM TB_USERS WHERE COD_USER = @COD_USER
ELSE
RAISERROR('El usuario no existe',16,1)
END
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
END CATCH
END
@Service
public class CrudUserService implements CrudUserDAO{
@PersistenceContext
private EntityManager em;
@SuppressWarnings({ "unchecked" })
@Override
public ValidateApiResponse MntUser(Integer op, String nom, String ema, Integer cod) {
ValidateApiResponse vapi = new ValidateApiResponse();
Session session = em.unwrap(Session.class);
try {
ProcedureCall call = session.createStoredProcedureCall("SP_CRUD_USERS");
call.registerParameter(1, Integer.class, ParameterMode.IN);
call.registerParameter(2, String.class, ParameterMode.IN).enablePassingNulls(true);
call.registerParameter(3, String.class, ParameterMode.IN).enablePassingNulls(true);
call.registerParameter(4, Integer.class, ParameterMode.IN).enablePassingNulls(true);
call.setParameter(1, op);
call.setParameter(2, nom);
call.setParameter(3, ema);
call.setParameter(4, cod);
vapi.dTable = call.getResultList();
vapi.Attr = "OK";
//call.execute();
} catch (Exception e) {
vapi.Error = e.getMessage();
} finally {
session.close();
}
return vapi;
}
}
public class ApiResponse {
public String Msj;
public String MsjDetail;
public List<Object> dtCollection;
public int MsjCode;
public ApiResponse() {
this.Msj = "";
this.MsjDetail = "";
this.MsjCode = -1;
this.dtCollection = new ArrayList<>();
}
}
public class ValidateApiResponse {
public String Error;
public String Attr;
public List<Object> dTable;
public ValidateApiResponse() {
this.Error = "";
this.Attr = "";
this.dTable = new ArrayList<>();
}
}
服务
ALTER PROC [dbo].[SP_CRUD_USERS]
@OPCION INT = 0,
@NOM_USER VARCHAR(50) = NULL,
@EMA_USER VARCHAR(50) = NULL,
@COD_USER INT = 0
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
IF @OPCION = 1
BEGIN
SELECT * FROM TB_USERS
END
ELSE IF @OPCION = 2
BEGIN
IF NOT EXISTS (SELECT * FROM TB_USERS WHERE EMA_USER = @EMA_USER)
BEGIN
IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
RAISERROR('Ingresar un dato para registrar',16,1)
ELSE
INSERT INTO TB_USERS VALUES (@NOM_USER, @EMA_USER)
END
ELSE
RAISERROR('El email ya existe',16,1)
END
ELSE IF @OPCION = 3
BEGIN
IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
BEGIN
IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
RAISERROR('Ingresar un dato para actualizar',16,1)
ELSE
UPDATE TB_USERS SET NOM_USER = @NOM_USER, EMA_USER = @EMA_USER WHERE COD_USER = @COD_USER
END
ELSE
RAISERROR('El usuario no existe',16,1)
END
ELSE IF @OPCION = 4
BEGIN
IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
DELETE FROM TB_USERS WHERE COD_USER = @COD_USER
ELSE
RAISERROR('El usuario no existe',16,1)
END
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
END CATCH
END
@Service
public class CrudUserService implements CrudUserDAO{
@PersistenceContext
private EntityManager em;
@SuppressWarnings({ "unchecked" })
@Override
public ValidateApiResponse MntUser(Integer op, String nom, String ema, Integer cod) {
ValidateApiResponse vapi = new ValidateApiResponse();
Session session = em.unwrap(Session.class);
try {
ProcedureCall call = session.createStoredProcedureCall("SP_CRUD_USERS");
call.registerParameter(1, Integer.class, ParameterMode.IN);
call.registerParameter(2, String.class, ParameterMode.IN).enablePassingNulls(true);
call.registerParameter(3, String.class, ParameterMode.IN).enablePassingNulls(true);
call.registerParameter(4, Integer.class, ParameterMode.IN).enablePassingNulls(true);
call.setParameter(1, op);
call.setParameter(2, nom);
call.setParameter(3, ema);
call.setParameter(4, cod);
vapi.dTable = call.getResultList();
vapi.Attr = "OK";
//call.execute();
} catch (Exception e) {
vapi.Error = e.getMessage();
} finally {
session.close();
}
return vapi;
}
}
public class ApiResponse {
public String Msj;
public String MsjDetail;
public List<Object> dtCollection;
public int MsjCode;
public ApiResponse() {
this.Msj = "";
this.MsjDetail = "";
this.MsjCode = -1;
this.dtCollection = new ArrayList<>();
}
}
public class ValidateApiResponse {
public String Error;
public String Attr;
public List<Object> dTable;
public ValidateApiResponse() {
this.Error = "";
this.Attr = "";
this.dTable = new ArrayList<>();
}
}
控制器
@RestController
public class CrudUserController {
@Autowired
private CrudUserService service;
@RequestMapping(value = "/CrudUsers", method = RequestMethod.POST)
public @ResponseBody ApiResponse CrudUsers(@RequestParam(value = "option", required = true) Integer op,
@RequestParam(value = "nomUser", required = false) String nom,
@RequestParam(value = "emaUser", required = false) String ema,
@RequestParam(value = "codUser", required = false) Integer cod){
ValidateApiResponse vapi = new ValidateApiResponse();
ApiResponse api = new ApiResponse();
try {
vapi = service.MntUser(op,nom,ema,cod);
if (vapi.Error == null || vapi.Error == "") {
if (vapi.Attr == "OK") {
api.MsjCode = 200;
api.Msj = "OK";
api.dtCollection = vapi.dTable;
} else {
api.MsjCode = 400;
api.Msj = "Dismissed Request";
api.MsjDetail = vapi.Attr;
}
} else {
api.Msj = "Internal Server Error";
api.MsjDetail = vapi.Error;
api.MsjCode = 500;
}
} catch (Exception e) {
api.Msj = "Internal Server Error";
api.MsjDetail = e.getMessage();
api.MsjCode = 500;
}
return api;
}
}
ApiResponse
ALTER PROC [dbo].[SP_CRUD_USERS]
@OPCION INT = 0,
@NOM_USER VARCHAR(50) = NULL,
@EMA_USER VARCHAR(50) = NULL,
@COD_USER INT = 0
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
IF @OPCION = 1
BEGIN
SELECT * FROM TB_USERS
END
ELSE IF @OPCION = 2
BEGIN
IF NOT EXISTS (SELECT * FROM TB_USERS WHERE EMA_USER = @EMA_USER)
BEGIN
IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
RAISERROR('Ingresar un dato para registrar',16,1)
ELSE
INSERT INTO TB_USERS VALUES (@NOM_USER, @EMA_USER)
END
ELSE
RAISERROR('El email ya existe',16,1)
END
ELSE IF @OPCION = 3
BEGIN
IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
BEGIN
IF @NOM_USER IS NULL OR @NOM_USER = '' AND @EMA_USER IS NULL OR @EMA_USER = ''
RAISERROR('Ingresar un dato para actualizar',16,1)
ELSE
UPDATE TB_USERS SET NOM_USER = @NOM_USER, EMA_USER = @EMA_USER WHERE COD_USER = @COD_USER
END
ELSE
RAISERROR('El usuario no existe',16,1)
END
ELSE IF @OPCION = 4
BEGIN
IF EXISTS (SELECT * FROM TB_USERS WHERE COD_USER = @COD_USER)
DELETE FROM TB_USERS WHERE COD_USER = @COD_USER
ELSE
RAISERROR('El usuario no existe',16,1)
END
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
END CATCH
END
@Service
public class CrudUserService implements CrudUserDAO{
@PersistenceContext
private EntityManager em;
@SuppressWarnings({ "unchecked" })
@Override
public ValidateApiResponse MntUser(Integer op, String nom, String ema, Integer cod) {
ValidateApiResponse vapi = new ValidateApiResponse();
Session session = em.unwrap(Session.class);
try {
ProcedureCall call = session.createStoredProcedureCall("SP_CRUD_USERS");
call.registerParameter(1, Integer.class, ParameterMode.IN);
call.registerParameter(2, String.class, ParameterMode.IN).enablePassingNulls(true);
call.registerParameter(3, String.class, ParameterMode.IN).enablePassingNulls(true);
call.registerParameter(4, Integer.class, ParameterMode.IN).enablePassingNulls(true);
call.setParameter(1, op);
call.setParameter(2, nom);
call.setParameter(3, ema);
call.setParameter(4, cod);
vapi.dTable = call.getResultList();
vapi.Attr = "OK";
//call.execute();
} catch (Exception e) {
vapi.Error = e.getMessage();
} finally {
session.close();
}
return vapi;
}
}
public class ApiResponse {
public String Msj;
public String MsjDetail;
public List<Object> dtCollection;
public int MsjCode;
public ApiResponse() {
this.Msj = "";
this.MsjDetail = "";
this.MsjCode = -1;
this.dtCollection = new ArrayList<>();
}
}
public class ValidateApiResponse {
public String Error;
public String Attr;
public List<Object> dTable;
public ValidateApiResponse() {
this.Error = "";
this.Attr = "";
this.dTable = new ArrayList<>();
}
}
我还希望它位于括号和键[{Cod:3,Name:“ccc”,Email:ccc@hotmail.com“}]诸如此类。因为存储过程的整个过程都已成功执行,所以不会抛出任何异常,因此无法捕获任何内容。只有当过程本身未能执行时,才能引发异常-SQLException 因此,如果某些操作(如DQL或DML)无法执行,您应该在过程中返回一些内容。(常见的方法是返回错误代码) 更新
我不熟悉T-SQL,但我在MS官方网站上找到了一个示例,演示了我所说的在您的过程中返回状态代码的内容。它的概念就像HTTP请求和响应一样,我们总是首先使用状态代码来确定请求是否已成功处理。如果出现问题,我们将进一步检查响应中的错误消息
首先,我对Spring框架不太了解,但我可以在您的代码中看到一些问题。您可以在进程的
CATCH
块中捕获SQL异常,然后执行PRINT
。这是“吞咽”的例外,它不会向外界提出。在纯ADO.NET中,通过为InfoMessage
设置eventhandler,您实际上可以捕获PRINT
消息,但再一次,我对Spring的了解还不够,无法说明您是否可以在那里执行。最好是在procsCATCH
块中重新引发错误,这样您的服务就会捕获它。但是当我进行调试时,它不会捕获@service中的捕获。它实际上是经过的,好像我的程序中没有错误。如果我输入同一封电子邮件,它应该会生成一个错误,但它不会。当然,它不会捕获它,因为没有错误“冒泡”到您的服务。错误在SQLCATCH
块中处理。是的,我已经更改了它。但我仍然无法获得错误,或者创建一个输出参数会更好吗?您能给我一个如何执行的示例吗?控制台向我显示了SQLEXCEPTIONHELPER“错误电子邮件”,但现在它向我显示:“org.hibernate.exception.sqlgrammareException:调用CallableStatement.getMoreResults时出错”。我并没有得到消息。