我的代码多年来一直像魅力一样.它打破了Mac上最近的Java更新.使用java 6(1.6.0_65-b14-462-11M4609)时,它按预期工作使用java 7(1.7.0_60-b19)时,它不起作用这是测试代码:PreparedStatement p = mConnection.pre...
我的代码多年来一直像魅力一样.它打破了Mac上最近的Java更新.
>使用java 6(1.6.0_65-b14-462-11M4609)时,它按预期工作
>使用java 7(1.7.0_60-b19)时,它不起作用
这是测试代码:
PreparedStatement p = mConnection.prepareStatement("SELECT rowid, * FROM cases_customers WHERE case_id = ?");
p.setLong(1, 2);
ResultSet r = p.executeQuery();
System.out.println("One result? " + r.next());
p = mConnection.prepareStatement("SELECT rowid, * FROM cases_customers WHERE case_id = ? + '0'");
p.setLong(1, 2);
r = p.executeQuery();
System.out.println("At least one result? " + r.next());
输出:
At least one result? false
At least one result? true
由于添加,第二个查询强制将数据绑定为数字.因此,即使数据在代码中被绑定了很长时间,它也会在某种程度上被转换为字符串.
我没有更改我的SQLite JDBC驱动程序(这是xerial的3.7.2).
我使用Java Web Start分发这个桌面应用程序,并且通过直接调用javac进行编译的GNU make文件“手动”完成编译/ jar捆绑.编译后的jar / app按预期工作,我的意思是上面的代码输出true / true.
这是构建配置:
在运行代码时,我最终在DB.java(来自sqlite-jdbc-3.7.2)中,在方法DB#sqlbind中:
else if (v instanceof Long) {
return bind_long(stmt, pos, ((Long) v).longValue());
}
>在java 6中,这个DB抽象类实现在NativeDB.java中,并调用本机bind_long.
>在java 7中,这个DB抽象类实现在NestedDB.java中并调用它:
.
@Override
synchronized int bind_long(long stmt, int pos, long v) throws SQLException {
return bind_text(stmt, pos, Long.toString(v)); // TODO
}
这是long值绑定为String的位置.
解决方法:
我的部分分析是在问题本身,请参阅编辑历史.
我使用的是SQLite JDBC驱动程序,它使用java 6中的本机代码和java 7中的java代码.本机代码按预期工作,而java代码将长值绑定为字符串.我将我的JDBC驱动程序更新为更新的版本,它使用java 6和7中的本机代码.
现在它工作正常.
本文标题为:Sqlite长参数与java 7绑定为字符串,而不是java 6
基础教程推荐
- Java装饰者模式的示例详解 2022-11-05
- SpringBoot Loki安装简介及实战思路 2023-07-01
- Spring详解四种加载配置项的方法 2023-01-24
- Sentinel整合Feign流程详细讲解 2023-05-08
- 浅谈controller中调用多个service方法的问题 2022-11-05
- 关于jd-gui启动报This program requires Java 1.8+的错误问题及解决方法 2022-11-08
- Springboot 手动分页查询分批批量插入数据的实现流程 2023-02-19
- 一文教你利用Stream API批量Mock数据的方法 2023-05-13
- 详解velocity模板使javaWeb的html+js实现模块化 2023-08-01
- 使用JPA传递参数的方法 2022-12-16