我正在使用一些以通用方式执行数据库操作的遗留代码,以便用户/开发人员可以通过仅更改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驱动程序中的错误?是否可以在不更改代码的情况下使此案例有效?
答案 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);