String sql = " select lr.* from (select top ? * from (select top ? rc.* from location_records as rc order by rc.id asc)as a order by a.id desc)as lr where 1=1 and lr.location =  'XREM'  and lr.consume_dt >'2009-10-25'  and lr.consume_dt <'2009-11-02'  and lr.Link_id ='L05'  and lr.emp_no = hs.emp_no order by lr.id "int pageNum = 1;
int pageCount = 36;//各位如果觉得乱的话 可以只看 红色部分
public List<CRecords> getByCondition(String sql,final int pageNum,final int pageCount) throws Exception{
// TODO Auto-generated method stub
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(definition);
List<CRecords> result = null;
try{
result = (List<CRecords>)jdbcTemplate.execute(sql,new PreparedStatementCallback(){
public Object doInPreparedStatement(PreparedStatement pst) throws SQLException{
int records = pageCount*pageNum;
pst.setInt(1, pageCount);
pst.setInt(2,records);

ResultSet rst =  pst.executeQuery();
List<CRecords> rlist = new ArrayList<CRecords>();
while(rst.next())
{
CRecords cr = new CRecords();
cr.setAct_UsedMoney(rst.getString("ACT_UsedMoney"));
cr.setCtrl_id(rst.getString("Ctrl_id"));
cr.setEmp_No(rst.getString("Emp_No"));
cr.setLink_id(rst.getString("link_id"));
cr.setConsume_DT(rst.getString("consume_dt"));
cr.setEmpName(rst.getString("name"));
cr.setLocation(rst.getString("location"));
rlist.add(cr);
}
return rlist;
}

});
}catch(Exception ex)
{
transactionManager.rollback(status);
ex.printStackTrace();

}

return result;
}我的本意是在 doInPreparedStatement()方法中 设置下preparedstatement的参数,然后执行查询,但是执行到
pst.executeQuery() 这句却报异常:
org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [select lr.* from (select top ? * from (select top ? rc.* from location_records as rc order by rc.id asc)as a order by a.id desc)as lr where 1=1 and lr.location =  'XREM'  and lr.consume_dt >'2009-10-25'  and lr.consume_dt <'2009-11-02'  and lr.Link_id ='L05'  and lr.emp_no = hs.emp_no order by lr.id ]; SQL state [HY000]; error code [170]; [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]第 1 行: '@P1' 附近有语法错误。;貌似 是参数没设置进去! 请教达人!

解决方案 »

  1.   

    先不设置参数看看你的sql能否正常运行
      

  2.   

    PrepareStatement 的实现不允许你select ? from xx where xxx 
    ?这些只能放在where后面。。 你动态concat这些SQL string了。 
      

  3.   

    你先在数据库中测试下sql语句能通过不
      

  4.   

    先顶几位热心的朋友 如果 我把SQL语句在BO层 拼接完毕,在executeQuery()方法中只做执行,则不会出错.
    另外 我翻阅了Spring的源代码 他好像有一步 是用一个Connection加上我传递进去的sql语句
    getByCondition(String sql,final int pageNum,final int pageCount)  创建一个PreparedStatement对象的
    4楼兄弟 你说的可能性存在 但知道从何证明呢?
      

  5.   


    有道理 java API上介绍这个对象。表示预编译的 SQL 语句的对象。 
    SQL 语句被预编译并且存储在 PreparedStatement 对象中。然后可以使用此对象高效地多次执行该语句。 既然要预编译,select 部分就要先确定下来,而不能是变化的参数。这个问题只能是先拼接好SQL,再执行。
      

  6.   

    我觉得 楼上说的没啥道理哦 where后面的 和select后面的 在设置预处理符这个层面上 不该有什么区别吧?
      

  7.   


    预处理是处理获得的字段个数,而 where 语句是处理结果集个数。不一样的概念哦。结果集个数本来就是动态的。而字段个数,必须事先编译好。去看他 PreparedStatement 源码中为了实现预编译的地方就知道了,他不会对where 后面的条件做。如果你where 后面的条件的个数也有变化,那PreparedStatement 会重新编译,没有发挥预编译的效果。看源码吧。。
      

  8.   

    看了下详细说明,他会对where 后面的条件也做预编译。如果你where 后面的条件的个数也有变化,那PreparedStatement 会重新编译,没有发挥预编译的效果。 
      

  9.   

    PreparedStatement 和 Statement 相比 抛开使用方便和效率
    是不是还有 安全因素? 一只听说 Sql注入,百度上有人说用 PreparedStatement就可以防止sql注入?
      

  10.   


    是的,PreparedStatement 的参数用 ? ,可以避免别人传入 1=1 这样的注入语句。