HSQLDB PreparedStatement的参数类型
问题描述:
我在表达结果遇到了一些意外的错误:HSQLDB PreparedStatement的参数类型
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之前/之后的参数类型?反映?
更新:所以,我创建defineParameterType在JDBCPreparedStatement像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!还需要更改结果类型或重新分析查询。进一步深入研究......
答
唯一能做的我发现没有源黑客是
select CAST(? AS DOUBLE) * CAST(? AS DOUBLE) * CAST(? AS DOUBLE) from dual
为什么你使用'方法setObject()'这是受自动装箱,而不是更approriate'setBigDecimal()'或'setDouble()'? – 2014-11-24 20:21:23
@a_horse_with_no_name一个有效的问题,但有趣的是'setBigDecimal()'和'setDouble()'产生了相同的结果。 – 2014-11-24 20:43:38
某些数据库不支持这样的参数,或者默认值可能是您不需要的数据类型。尝试添加一个明确的转换,或者使用带有一个类型参数的'setObject'。 – 2014-11-25 08:43:18