【发布时间】:2014-11-24 20:14:22
【问题描述】:
我在表达式结果中遇到了一些意外错误:
conn = DriverManager.getConnection("jdbc:hsqldb:mem:test;sql.syntax_ora=true", null);
stmt = conn.prepareStatement("select ? * ? * ? from dual");
stmt.setObject(1, 1000000.00);
stmt.setObject(2, 0.01);
stmt.setObject(3, 3.45); // setDouble no difference
rs = stmt.executeQuery();
rs.next();
System.out.println(rs.getObject(1));
你可以试试,结果是0! 为什么?因为 hsqldb 驱动程序将默认参数类型设置为 int。 0.01 在 JDBCPreparedStatement.java 中转换为 0:4257 o = outType.convertToDefaultType(session, o);
如何在 jdbc 中的 prepareStatement 之前/之后更改参数类型?反映?
更新:所以,我在 JDBCPreparedStatement 中创建了 defineParameterType,就像在 OraclePreparedStatement 中一样
public void defineParameterType(int index, int type)
{
if(index <= 0 || index > parameterTypes.length)
throw new IndexOutOfBoundsException();
Type newType = Type.getDefaultTypeWithSize(type);
if(newType != null)
parameterTypes[index - 1] = newType;
}
但是,它仍然返回 0!还需要更改结果类型或重新解析查询。进一步挖掘......
【问题讨论】:
-
你为什么使用
setObject(),它会自动装箱而不是更合适的setBigDecimal()或setDouble()? -
@a_horse_with_no_name 一个有效的问题,但有趣的是,
setBigDecimal()和setDouble()产生了相同的结果。 -
有些数据库不支持这样的参数,或者默认的可能是你不想要的数据类型。尝试添加显式转换,或使用带有类型参数的
setObject。 -
标记,“select CAST(? AS DOUBLE) * CAST(? AS DOUBLE) * CAST(? AS DOUBLE) from dual”正常工作。
-
请将解决方案作为答案发布并接受。