org.h2.jdbc.JdbcSQLDataException: 转换“'MONTH'”时数据转换错误; SQL 声明:
org.h2.jdbc.JdbcSQLDataException: Data conversion error converting "'MONTH'"; SQL statement:
当我尝试使用准备好的语句插入数据库时发生错误。我正在尝试使用我的 H2 嵌入式数据库中的 DateAdd 函数添加到当前日期以创建新的到期日期。
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: Data conversion error converting
"'MONTH'"; SQL statement: INSERT INTO BLOOMHEALTH.CLIENTS VALUES (
?,?,?,?,?,DATEADD(?,?,?),?,?,?) -- (?1, ?2, ?3, ?4, ?5, DATEADD('',
?6, ?7), ?8, ?9, ?10) [22018-200]
这是为 SQL 语句发送的数据。
weeks.setText("'WEEK'");
months.setText("'MONTH'");
H2 的最新版本不再支持此函数中日期时间单位的参数化,因为它会导致其他问题。不幸的是,H2 1.4.200 抛出了一个奇怪的异常而不是实际的异常,这个问题在那个版本之后被修复了。
您需要直接指定日期时间单位(DATEADD(MONTH, ?, ?)
)。如果需要支持多个单元,可以使用case:
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'")
(或者在 WHEN '''MONTH''' THEN …
的情况下您可以使用 'MONTH'
)。
当我尝试使用准备好的语句插入数据库时发生错误。我正在尝试使用我的 H2 嵌入式数据库中的 DateAdd 函数添加到当前日期以创建新的到期日期。
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: Data conversion error converting "'MONTH'"; SQL statement: INSERT INTO BLOOMHEALTH.CLIENTS VALUES ( ?,?,?,?,?,DATEADD(?,?,?),?,?,?) -- (?1, ?2, ?3, ?4, ?5, DATEADD('', ?6, ?7), ?8, ?9, ?10) [22018-200]
这是为 SQL 语句发送的数据。
weeks.setText("'WEEK'");
months.setText("'MONTH'");
H2 的最新版本不再支持此函数中日期时间单位的参数化,因为它会导致其他问题。不幸的是,H2 1.4.200 抛出了一个奇怪的异常而不是实际的异常,这个问题在那个版本之后被修复了。
您需要直接指定日期时间单位(DATEADD(MONTH, ?, ?)
)。如果需要支持多个单元,可以使用case:
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'")
(或者在 WHEN '''MONTH''' THEN …
的情况下您可以使用 'MONTH'
)。