继续SQL2000分页----传参问题

andying 发布于 2014/08/26 15:08
阅读 243
收藏 0

@JFinal 你好,想跟你请教个问题:

继续上一次自定义分页(SQL2000)问题,现在又遇到一问题,上次是没加入查询参数的情况下是可以的(查所有记录),现在我想加入一些查询条件(一些查询参数),如下:

String  sql= " from ( "+
      " select t1.id,t1.dh,t1.dDate,t1.vTec_Dh,t1.nMK_id,t1.vCustNo,t1.vContatPer,t1.vContaTEL "+
      " ,t1.vCurrencyNo,t1.phr,t1.phr_name,t1.lphbz,t1.phrq,t2.StyleCode as PadNo,t2.size_fw as SizeRange "+
      " ,case when t1.lPhbz=1 then '已批核'  else  '未批核' end as vPhzt "+
      " from Sal_Quotation t1 " +
      " left join  Mould_Style t2 on t1.nMK_id = t2.id "+
      " left join  customs_matKind t3  on t2.vCustoms_code=t3.kindCode "+
      " left join pay_mstr  t4 on t1.vPayTerm=t4.pay_code "+
      " left join SCR_Transport_Mstr t5  on t1.vDelyTerm=t5.transCode "+
      " left join Base_customs_type t6  on t1.vCustomsFormat=t6.vCode "+
      " where t1.dDate=? and t1.vCustNo like ? and t2.styleCode like ?) t1   ";

加了3个参数,由于在自定义分页中这个sqlExceptSelect拼接了2次,所以生成后的分页SQL语句就变成了6个?号,也就是变成了6个参数,然后我传参也传6个:

Object[] paras=new Object[6];

但现在问题来了,在Model中有一句统计总记录数的代码,生成后如下:

select count(*)  from ( select t1.id,t1.dh,t1.dDate,t1.vTec_Dh,t1.nMK_id,t1.vCustNo,t1.vContatPer,t1.vContaTEL ,t1.vCurrencyNo,t1.phr,t1.phr_name,t1.lphbz,t1.phrq,t2.StyleCode as PadNo,t2.size_fw as SizeRange ,case when t1.lPhbz=1 then '已批核' else '未批核' end as vPhzt from Sal_Quotation t1 left join Mould_Style t2 on t1.nMK_id = t2.id left join customs_matKind t3 on t2.vCustoms_code=t3.kindCode left join pay_mstr t4 on t1.vPayTerm=t4.pay_code left join SCR_Transport_Mstr t5 on t1.vDelyTerm=t5.transCode left join Base_customs_type t6 on t1.vCustomsFormat=t6.vCode where t1.dDate=? and t1.vCustNo like ? and t2.styleCode like ?) t1

此句只有3个参数,而刚传的是6个参数,所以导致出错:

com.jfinal.plugin.activerecord.ActiveRecordException: com.microsoft.sqlserver.jdbc.SQLServerException: 索引 4 超出范围。

问题是如果只传三个参数,此处能通过,而到最后生成的总的分页SQL语句又不行了,它要6个参数才行,请问这又如何解决?thks.

 

加载中
0
糊搞

说实话,我没明白你为什么要手写分页。。。

JFinal中有直接的分页接口,Model.pagenate(...)和Db.pagenate(...),你只需要将SQL语句、SQL参数、分页参数传入,它会自动帮你处理分页。结果放在Page<Model>或Page<Record>中,返回的对象中本身就包含了分布时的TotalRow、TotalPage、CurrentPage等信息。。。

多看看API吧。。。

0
JFinal
JFinal
正常需要几个参数
0
andying
andying

引用来自“JFinal”的评论

正常需要几个参数

参数是不定的呀,现在查询界面只设3个input查询参数,如果日后要加多查询条件,参数个数就会增加.

0
andying
andying
SQL2000分页就烦在这,它不像mySQL,分页有个limit关键字,SQL2000自定义分页要把传进来的sqlExceptSelect作两次处理.
0
andying
andying

引用来自“糊搞”的评论

说实话,我没明白你为什么要手写分页。。。

JFinal中有直接的分页接口,Model.pagenate(...)和Db.pagenate(...),你只需要将SQL语句、SQL参数、分页参数传入,它会自动帮你处理分页。结果放在Page<Model>或Page<Record>中,返回的对象中本身就包含了分布时的TotalRow、TotalPage、CurrentPage等信息。。。

多看看API吧。。。

你用过MS-SQL2000数据库就明白了
0
JFinal
JFinal

引用来自“JFinal”的评论

正常需要几个参数

引用来自“andying”的评论

参数是不定的呀,现在查询界面只设3个input查询参数,如果日后要加多查询条件,参数个数就会增加.

     我是说具体到某个情况下是几个参数,假定你是两个参数,保障一下生成的 sql 只有两个问号即可,例如:

User.me.paginate(10, 20, "select *", "from ... where ? ..., ?", para_1, para_2);



生成的 sql 与参数个数一定要相同,至于如何保障相同,写好程序即可打完收工,尤其你的分页程序要写好

0
andying
andying

引用来自“JFinal”的评论

正常需要几个参数

引用来自“andying”的评论

参数是不定的呀,现在查询界面只设3个input查询参数,如果日后要加多查询条件,参数个数就会增加.

引用来自“JFinal”的评论

     我是说具体到某个情况下是几个参数,假定你是两个参数,保障一下生成的 sql 只有两个问号即可,例如:

User.me.paginate(10, 20, "select *", "from ... where ? ..., ?", para_1, para_2);



生成的 sql 与参数个数一定要相同,至于如何保障相同,写好程序即可打完收工,尤其你的分页程序要写好

问题是SQL2000自定义分页做不到吧?  能不能自定义Model,重载一下paginate,但这个方法又是私有的

private Page<M> paginate(Config config, Connection conn, int pageNumber, int pageSize, String select, String sqlExceptSelect, Object... paras) throws Exception {

 

JFinal
JFinal
参考一下mysql与oracle的分页方法,参考着实现即可打完收工
糊搞
这样回答说明你还没理解JFinal的分页是如何处理的
返回顶部
顶部