Database 获取“;java.sql.SQLException:值未绑定到语句”;例外

Database 获取“;java.sql.SQLException:值未绑定到语句”;例外,database,sqlite,jdbc,Database,Sqlite,Jdbc,我最近从sqlite-jdbc-3.7.2.jar升级到sqlite-jdbc-3.26.0.jar。我注意到代码中的insert查询因“java.sql.SQLException:Values not bind to statement”异常而失败 下面是一段代码,它适用于以前版本的sqlite: String sqlStatement = "INSERT INTO table_name(id,name,type,author,size) VALUES (?,?,?,?,?)"; try {

我最近从sqlite-jdbc-3.7.2.jar升级到sqlite-jdbc-3.26.0.jar。我注意到代码中的insert查询因“java.sql.SQLException:Values not bind to statement”异常而失败

下面是一段代码,它适用于以前版本的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
}
String sqlStatement=“插入到表中_名称(id、名称、类型、作者、大小)值(?,,,?,?)”;
尝试
{
Connection conn=this.connect();
PreparedStatement pstmt=conn.prepareStatement(sqlStatement))
{
pstmt.setInt(1,rs.getInt());
pstmt.setString(2,rs.getString());
pstmt.setInt(3,rs.getInt());
如果(某些条件)
{
pstmt.setString(4,rs.getString());
pstmt.setInt(5,rs.getInt());
}
pstmt.executeUpdate();
}
}
捕获(例外e)
{
//异常处理在这里进行
}
我已经阅读了发行说明,并检查了作为Query planner增强功能的一部分,几乎没有更改(Query planner检查绑定参数的值以帮助确定部分索引是否可用。 ). 但我仍然不清楚是什么增强以及它是如何影响我的代码的。 还有人可以指导我如何修复上述代码吗

谢谢,
Ketaki

在上述程序中,插入查询预期由用户填充5个值。 然而,若(somecondition)不满足,那个么第四个和第五个的值就不会被插入到查询中。这是因为sqlite-jdbc-3.26.0希望在执行查询之前填充所有值。在修复中,我通过插入else块确保即使“somecondition”为false,也填充所有值

修正:

if(某些条件)
{
pstmt.setString(4,rs.getString());
pstmt.setInt(5,rs.getInt());
}
其他的
{
pstmt.setString(4,rs.getString());
pstmt.setInt(5,rs.getInt());
}

在SQL查询字符串中有5个占位符/参数,但当
somecondition
为false时,只提供3个占位符/参数。这就是SQLite所抱怨的。这是您的实际代码吗?这里
PreparedStatement pstmt=conn.prepareStatement(sqlStatement))
您有一个额外的右括号,右下方有一个用花括号包围的块,为什么?是否存在缺少if语句且不允许参数获取值的情况?无论如何,你后来确实有这样一个if语句。不,额外的括号是错误的。语句是conn.prepareStatement(sqlStatement),因为我无法将实际代码粘贴到这里,所以我对它进行了一些修改,然后粘贴到了这里。请不要介意,谢谢科里恩。在我传递了所有列的值之后,问题就解决了。修改后的代码部分是:if(somecondition){pstmt.setString(4,rs.getString());pstmt.setInt(5,rs.getInt());}else{pstmt.setString(4,);pstmt.setInt(5,);}我确保每次填充所有列。谢谢你的帮助@Ketaki-如果这确实是SQLite以前版本的行为改变,那么请写一个简短的回答,解释您需要做什么来解决问题。这将有助于未来用户面对同样的问题。
 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>));
  }