【问题标题】:Return update error from SQL Server and catch it in Java从 SQL Server 返回更新错误并在 Java 中捕获它
【发布时间】:2021-02-01 17:33:52
【问题描述】:

我正在 SQL Server 中编写一个存储过程来更新患者轮班记录。为此,您必须验证数据库中是否存在dniPaciente。如果存在,则更新它,否则,它应该显示一条错误消息,指出未找到dniPaciente

我已经尝试了以下方法,但是我无法抛出错误消息。

CREATE PROCEDURE sobreTurno(@dniDelPaciente VARCHAR(8) ,@nu evaFecha DATE,
@nuevaHoraInicio TIME,@nuevaHoraFin TIME)
AS 
BEGIN TRY  
IF EXISTS (SELECT dniPaciente FROM Turno WHERE dniPaciente=@dniDelPaciente)
    UPDATE Turno
       SET [fecha]=@nuevaFecha, 
          [horaInicio]=@nuevaHoraInicio,
          [horaFin]=@nuevaHoraFin
     WHERE dniPaciente=@dniDelPaciente 
END TRY  
BEGIN CATCH  
  PRINT('¡dniPaciente not found in the DATABASE!')    
END CATCH

SQL Server 抛出的错误应该显示在 Java 的 catch 子句中。

try {

    CallableStatement sobreTurno = conexionBBDD.getConexionBBDD().prepareCall("{call sobreTurno(?,?,?,?)}");

    sobreTurno.setString(1, ventanaAsignacionSobreTurno.getDniPaciente());
    sobreTurno.setDate(2, new Date(ventanaAsignacionSobreTurno.getDateChooser().getTime()));
    sobreTurno.setTime(3, this.horaInicio);
    sobreTurno.setTime(4, this.horaFin);
    
 sobreTurno.execute();
 
} catch (Exception exeptionBBDD) {               
  //here I need to show the error message thrown from SQL SERVER                
}

【问题讨论】:

  • 对我来说,您似乎混淆了条件:“如果存在,则更新它”,但在代码中如果不存在则更新
  • 这是真的,你是对的。我已经更改了它,但它仍然无法向我抛出错误。
  • 我猜,你可以尝试使用RAISEERROR-功能docs.microsoft.com/en-us/sql/t-sql/language-elements/…
  • 你没有抛出错误?你在打印吗?要抛出它,请使用关键字 throw(而不是 print)。
  • 您正在吃掉您的程序中的错误 - 您的应用程序无法知道发生了什么。你可以重新抛出错误。但是您的程序包含一个更新语句 - 那么您为什么要抓住它呢?为什么您的 udpate 需要在 try/catch 块中?想想你的代码做了什么——如果它不适用,不要盲目地遵循一个模式。

标签: java sql-server sql-update try-catch


【解决方案1】:

正确的存储过程如下

ALTER PROCEDURE sobreTurno(@dniDelPaciente VARCHAR(8) ,@nuevaFecha DATE,
@nuevaHoraInicio TIME,@nuevaHoraFin TIME)
AS  
IF EXISTS (SELECT dniPaciente FROM Turno WHERE dniPaciente=@dniDelPaciente)
    UPDATE Turno
       SET [fecha]=@nuevaFecha, 
          [horaInicio]=@nuevaHoraInicio,
          [horaFin]=@nuevaHoraFin
     WHERE dniPaciente=@dniDelPaciente 
 ELSE THROW 50000, '¡dniPaciente not found in the DATABASE!', 0;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多