org.h2.jdbc.jdbcsqldataexception:转换“'month'”时发生数据转换错误;sql语句:

vcudknz3  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(248)

当我试图用准备好的语句插入到数据库中时发生错误。我试图添加到当前日期,以创建一个新的到期日期使用dateadd函数在我的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();
        }

确切的例外是:
org.h2.jdbc.jdbcsqldataexception:转换“月”时发生数据转换错误;sql语句:插入bloomhealth.clients值(?,?,?,dateadd(?,?),?,?,?)--(?1,?2,?3,?4,?5,dateadd('',?6,?7),?8,?9,?10)[22018-200]
下面是为sql语句的数据发送的内容。

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

nimxete21#

h2的最新版本不再支持此函数中日期时间单位的参数化,因为它会导致其他问题。不幸的是,h21.4.200抛出了一个奇怪的异常,而不是实际的异常,这个问题在该版本之后得到了修复。
您需要直接指定日期时间单位( DATEADD(MONTH, ?, ?) ). 如果需要支持多个单元,可以使用案例:

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)

你还需要使用 setText("MONTH") 而不是 "'MONTH'") (或者您可以使用 'MONTH' 在这个案子里 WHEN '''MONTH''' THEN … ).

相关问题