org.h2.jdbc.JdbcSQLDataException: Error de conversión de datos "'MONTH'"; declaración SQL:

Un error ocurre cuando intento insertar en una base de datos con una Declaración Preparada. Estoy tratando de añadir a la fecha actual para crear una nueva fecha de caducidad utilizando la función DateAdd en mi base de datos embedded H2.

        PreparedStatement sql = c.prepareStatement("INSERT INTO BLOOMHEALTH.CLIENTS VALUES ( ?,?,?,?,?,DATEADD(?,?,?),?,?,?)");
        String mem = bloomClient.getSsMember();
        try {
            sql.setString(1,bloomClient.getFirstName());
            sql.setString(2,bloomClient.getLastName());
            sql.setString(3,bloomClient.getPhoneNumber());
            sql.setString(4,bloomClient.getBirthday());
            sql.setString(5,bloomClient.getStartDate());
            sql.setString(6,text);
            sql.setInt(7,num);
            sql.setString(8,systemDate());
            sql.setInt(9,bloomClient.getSessionAmount());
            sql.setString(10,bloomClient.getTrainer());
            sql.setString(11,bloomClient.getSsMember());// problem here aswell, says invalid parameter(unsure why)
            sql.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }

La excepción exacta es:

org.h2.jdbc.JdbcSQLDataException: Error de conversión de datos "'MONTH'"; declaración SQL: INSERT INTO BLOOMHEALTH. CLIENTES VALUES ?,?,??,?,DATEADD(?,?,??,??) -- (?1, ?2, ?3, ?4, ?5, DATEADD(', ?6, ?7), ?8, ?9, ?10) [22018-200]

Aquí lo que se envía para los datos para la declaración SQL.

        weeks.setText("'WEEK'");
        months.setText("'MONTH'");

Pregunta hecha hace 3 años, 4 meses, 28 días - Por pixelpioneer


3 Respuestas:

  • Las versiones recientes de H2 no soportan la parametrización de unidades de fecha en esta función más porque causó otros problemas. Desafortunadamente, H2 1.4.200 lanza una rara excepción en lugar de la real, este problema fue fijado después de esa liberación.

    Necesita especificar una unidad de fechar directamente (DATEADD(MONTH, ?, ?)). Si necesita apoyar múltiples unidades, puede utilizar un caso:

    INSERT INTO BLOOMHEALTH.CLIENTS VALUES (?1, ?2, ?3, ?4, ?5,
    CASE ?6
        WHEN 'MONTH' THEN DATEADD(MONTH, ?7, ?8)
        WHEN 'WEEK' THEN DATEADD(WEEK, ?7, ?8)
        -- put all additional units here
    END
    ?9, ?10, ?11)
    

    También necesita usar setText("MONTH") en lugar de "'MONTH'") (o puedes usar 'MONTH' en el caso WHEN '''MONTH''' THEN …).

    Respondida el Dec 17, 2020 a las 20:55 - por codecraftsman32c9

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu código parece estar relacionado con la inclusión de las cadenas de texto "MONTH" y "WEEK" en lugar de los valores adecuados para la función DateAdd en la declaración SQL. Para solucionar este error, necesitas corregir la forma en la que estás pasando los parámetros de la función DateAdd en tu sentencia SQL.

    Aquí te dejo una sugerencia de cómo puedes modificar tu código para corregir este problema:

    java
    PreparedStatement sql = c.prepareStatement("INSERT INTO BLOOMHEALTH.CLIENTS VALUES (?, ?, ?, ?, ?, DATEADD(?, ?, ?), ?, ?, ?, ?)");
    String mem = bloomClient.getSsMember();
    try {
        sql.setString(1, bloomClient.getFirstName());
        sql.setString(2, bloomClient.getLastName());
        sql.setString(3, bloomClient.getPhoneNumber());
        sql.setString(4, bloomClient.getBirthday());
        sql.setString(5, bloomClient.getStartDate());
        sql.setString(6, text);
        sql.setInt(7, num);
        sql.setString(8, "MONTH"); // Aquí deberías pasar el tipo correcto de unidad de tiempo para DateAdd
        sql.setInt(9, bloomClient.getSessionAmount());
        sql.setString(10, bloomClient.getTrainer());
        sql.setString(11, bloomClient.getSsMember()); 
        sql.execute();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    

    En esta versión corregida, se ha modificado la forma en la que se pasa el tipo de unidad de tiempo a la función DateAdd. Debes asegurarte de utilizar el tipo de unidad de tiempo correcto en lugar de la cadena de texto "MONTH".

    Por favor, inténtalo y verifica si este cambio soluciona el error que estás experimentando. Si necesitas más ayuda, no dudes en preguntar.

    Respondida el Dec 18, 2020 a las 20:57 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error "Error de conversión de datos "'MONTH'"; declaración SQL: ..." indica que la base de datos H2 no puede convertir el valor "'MONTH'" al tipo de datos esperado para el parámetro en la consulta SQL.

    En tu código, estás utilizando la función DATEADD para añadir un intervalo de tiempo a una fecha. El segundo parámetro de DATEADD especifica la unidad del intervalo de tiempo, que en tu caso es "'MONTH'".

    Sin embargo, la base de datos H2 espera que el segundo parámetro de DATEADD sea un intervalo de tiempo numérico, como 1, 2, etc., que representa el número de unidades de tiempo que se deben añadir.

    Para resolver este problema, debes cambiar el valor del segundo parámetro de DATEADD a un valor numérico que represente el número de meses que deseas añadir a la fecha. Por ejemplo, si deseas añadir 2 meses a la fecha, debes cambiar el código a:

    java
    sql.setString(6, "2");
    

    También debes asegurarte de que el parámetro ssMember se establece correctamente, ya que el mensaje de error menciona un "parámetro no válido". Verifica que el valor de bloomClient.getSsMember() sea correcto y que no contenga caracteres especiales o valores nulos que puedan causar problemas.

    Respondida el Dec 18, 2020 a las 21:06 - por Gemini

    Votos positivos: 0 | Votos negativos: 0