我最近从sqlite-jdbc-3.7.2.jar升级到sqlite-jdbc-3.26.0.jar。我观察到我的代码中的插入查询因“ java.sql.SQLException:值未绑定到语句”异常而失败。
下面是一段代码,对于先前版本的sqlite来说效果很好:
String sqlStatement = "INSERT INTO table_name(id,name,type,author,size) VALUES (?,?,?,?,?)";
try
{
Connection conn = this.connect(<name>);
PreparedStatement pstmt = conn.prepareStatement(sqlStatement))
{
pstmt.setInt(1, rs.getInt(<value>));
pstmt.setString(2, rs.getString(<value>));
pstmt.setInt(3, rs.getInt(<value>));
if (somecondition)
{
pstmt.setString(4, rs.getString(<Value>));
pstmt.setInt(5, rs.getInt(<value>));
}
pstmt.executeUpdate();
}
}
catch(Exception e)
{
//handling of exception goes here
}
我已经阅读了发行说明https://www.sqlite.org/changes.html,并检查了作为Query Planner增强功能的一部分,没有什么变化(查询规划器检查绑定参数的值,以帮助确定部分索引是否可用。 )。 但是我仍然不清楚增强功能是什么以及它如何影响我的代码。 还可以有人指导我如何解决以上代码吗?
谢谢, 凯塔基
答案 0 :(得分:2)
在上面的程序中,插入查询期望用户填充5个值。 但是,如果不满足(某些条件),则不会在查询中插入第4个和第5个值。这是因为sqlite-jdbc-3.26.0期望在执行查询之前填充所有值。在此修复程序中,我确保通过插入else块来填充所有值,即使“ somecondition”为false。
修复:
if (somecondition)
{
pstmt.setString(4, rs.getString(<Value>));
pstmt.setInt(5, rs.getInt(<value>));
}
else
{
pstmt.setString(4, rs.getString(<default-value>));
pstmt.setInt(5, rs.getInt(<defaul`enter code here`t-value>));
}