PostgreSQL JDBC中int / numeric列上的PreparedStatement.setString

时间:2014-11-05 21:59:35

标签: java postgresql jdbc

我正在使用一些以通用方式执行数据库操作的遗留代码,以便用户/开发人员可以通过仅更改JDBC驱动程序来使用不同的数据库。

我有PostgreSQL JDBC驱动程序的问题。我的测试用例:

 //ddl
 CREATE TABLE test
 (
    id numeric,
    name text,
 )

 //java code
 String sqlCmd = "INSERT INTO test values (?, ?)";

 PreparedStatement ps = connection.prepareStatement( sqlCmd );
 ps.setString( 1, "1" );
 ps.setString( 1, "name1" );
 ps.executeUpdate();

使用Postgres,这种情况的结果是一个带有消息的异常:“无法将字符串转换为int ...”

使用PreparedStatement.setString()设置数据库期望为数字的值是不合适的吗? 我是否应该期望JDBC驱动程序自动将java类型转换为数据库类型?

此测试通过其他数据库,包括H2和MySQL。 PostgreSQL的失败是否反映了JDBC驱动程序中的错误?是否可以在不更改代码的情况下使此案例有效?

2 个答案:

答案 0 :(得分:6)

java.sql.PreparedStatement的{​​p> The documentation有这样的说法:

  

注意:用于设置IN参数值的setter方法(setShort,setString等)必须指定与输入参数的已定义SQL类型兼容的类型。例如,如果IN参数具有SQL类型INTEGER,则应使用方法setInt。

某个特定的数据库或JDBC驱动程序是否允许你对它自己的事情很邋of,但是你没有理由期望所有的驱动程序都允许这样的slop,即使某些驱动程序会这样做。

答案 1 :(得分:-3)

您正在使用setString()方法插入整数而postgres无法执行此操作,请使用

ps.setInt(1, INTEGER_VALUE);