Sqlite长参数与java 7绑定为字符串,而不是java 6

Sqlite长参数与java 7绑定为字符串,而不是java 6,第1张

概述我的代码多年来一直像魅力一样.它打破了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_cus 我的代码多年来一直像魅力一样.它打破了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? falseAt 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中并调用它:

.

@OverrIDesynchronized int bind_long(long stmt,int pos,long v) throws sqlException {    return bind_text(stmt,Long.toString(v)); // Todo}

这是long值绑定为String的位置.

解决方法 我的部分分析是在问题本身,请参阅编辑历史.

我使用的是sqlite JDBC驱动程序,它使用java 6中的本机代码和java 7中的java代码.本机代码按预期工作,而java代码将长值绑定为字符串.我将我的JDBC驱动程序更新为更新的版本,它使用java 6和7中的本机代码.

现在它工作正常.

总结

以上是内存溢出为你收集整理的Sqlite长参数与java 7绑定为字符串,而不是java 6全部内容,希望文章能够帮你解决Sqlite长参数与java 7绑定为字符串,而不是java 6所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1155166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存