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

标签 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 的失败是否反射(reflect)了 JDBC 驱动程序中的错误?是否可以在不更改代码的情况下使这个案例工作?

最佳答案

The documentation对于 java.sql.PreparedStatement 有这样的说法:

Note: The setter methods (setShort, setString, and so on) for setting IN parameter values must specify types that are compatible with the defined SQL type of the input parameter. For instance, if the IN parameter has SQL type INTEGER, then the method setInt should be used.

特定的数据库或 JDBC 驱动程序是否允许您对此草率是它自己的事情,但您没有理由期望所有驱动程序都允许这样的草率,即使某些驱动程序允许。

关于java - PostgreSQL JDBC 中 int/numeric 列上的 PreparedStatement.setString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26767947/

相关文章:

java - Apache POI 使用 Java 生成带有图像的 excel(自动调整行大小)

java - 删除字符之间的字符串

java - X509证书获取PublicKey

postgresql - 如何从 PostgreSQL 数据库中删除表 * 或 * View ?

sql - 重命名其中包含空格的列

mysql - JdbcTemplate,MySQL错误

java - Spring HATEOAS - 两个相同的链接

postgresql - 如何退出 PostgreSQL 命令行实用程序 : psql

jdbc - 在 data-config.xml (Solr 4.2.1) 中使用来自 solrcore.properties 的属性

Tomcat 连接池、maxActive 和 maxWait 属性