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

ost*_*try 5 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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

Joh*_*ger 6

该文档java.sql.PreparedStatement有这样一段话:

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

一个特定的数据库或JDBC驱动程序是否允许你对它自己的风骚是它自己的事情,但你没有理由期望所有的驱动程序将允许这样的slop,即使某些人这样做.