Prepare语句无效的列索引错误

时间:2011-08-11 05:11:47

标签: java sql prepared-statement

我得到invalid column index以获得准备好的陈述 这是我的代码

// Excluding some unnecessary code
counter = 1;
if (rsTableNames.next()) 
{
    // Creating Query for prepared statement
    String getCode = "select * from ( select c_name from " 
          + rsTableNames.getString(1)+ " where lower(c_name) like ?%'";
    while (rsTableNames.next()) 
    {
      getCode += " union select c_name from " + 
      rsTableNames.getString(1)+ " where lower(c_name) like ?%'";
      counter++;
    }
    getCode += " ) where rownum <= " + maxRecords;
        // Now  The getCode contains 3 place holders ie ?           
    pst = con.prepareStatement(getCode);
    String param = "'" + query.toLowerCase();

    for(int i=1;i<=counter;i++)
    {
        pst.setString(i,param);  // when i=3 exception is thrown
    }
}

虽然查询包含3个占位符,但i变为3时,我收到异常 编辑(提示):我认为问题在于'正在造成破坏。我们怎么能逃脱呢?

2 个答案:

答案 0 :(得分:6)

我不知道这是否是问题的原因,但我不认为参数的工作方式与您认为引用时的方式完全相同。您仍在每个参数后的代码中添加引号,并作为参数的开头。我怀疑你只是想要:

rsTableNames.getString(1)+ " where lower(c_name) like ?";

在每个地方,然后:

String param = query.toLowerCase() + "%";

由于引用解析,这可能会解决问题 - 我认为您的中间参数被认为是大型文字的一部分。

答案 1 :(得分:0)

你确定有3个吗?在sql中?尝试在for循环中打印整个preparedStatement。

我怀疑你这里的许多循环可能没有像你预期的那样工作,最后在preparedStatement中只有2个参数。

抛出了什么异常? 来自Java API: 抛出: SQLException - 如果parameterIndex与SQL语句中的参数标记不对应;如果发生数据库访问错误或在关闭的PreparedStatement上调用此方法

另外,如果您共享con连接和con.preparedStatement实例,请确保已正确关闭每个