后台传递参数时设置数据类型
在实际项目需求中,参数的灵活运用至关重要,集智数据平台提供了参数模板和报表模板,节省了用户写form填报表单的时间。但是,有一些参数并非来之参数模板或者form表单,可能是后台传入,也可能是业务运算后拼接而成,这些参数再传递给报表时就需要设置参数类型,否则可能会出现参数sql异常的报错。
下面来重现一下这个错误:
一:创建报表模板并设置参数
数据源为润乾内置demo数据源
数据集为:SELECT 订单.订单ID,订单.货主名称 FROM 订单 WHERE 订单.订单ID in ( ? )
参数名为:arg1 参数类型为:字符串组
二:测试代码:
<%@ page language=“java” import=“java.util.*” pageEncoding=“utf-8″%>
<%@page import=“com.runqian.report4.usermodel.Context”%>
<%@page import=“com.runqian.report4.usermodel.ParamMetaData”%>
<%@page import=“com.runqian.report4.model.ReportDefine”%>
<%@page import=“com.runqian.report4.util.ReportUtils”%>
<%@page import=“com.runqian.report4.usermodel.Engine”%>
<%@page import=“com.runqian.report4.usermodel.IReport”%>
<%try{
Context cxt = new Context();
String reportFile = “d:\\Program Files\\reportHome\\webapps\\demo\\reportFiles\\args.raq”;
//定义或拼接为字符串strs
String strs =”10501,10502,10503″;
ReportDefine rd = (ReportDefine)ReportUtils.read( reportFile );
ParamMetaData pmd = rd.getParamMetaData();
String paramOrMocrName = “”;
if(pmd != null){
for(int i = 0, count = pmd.getParamCount(); i < count; i ++ ) { //讲究优化的写法
paramOrMocrName = pmd.getParam(i).getParamName(); //获取参数名
//System.out.println(paramOrMocrName);
//设参数值,因为只有一个参数,所以直接给其赋值了。
cxt.setParamValue(paramOrMocrName,strs);
}
}
//运算报表
Engine engine = new Engine(rd, cxt);
IReport iReport = engine.calc();
//页面显示
String htmlText = ReportUtils.toHTMLString(iReport,“report1″,request);
out.print(htmlText);
}catch (Throwable t ){
}
%>
运行此代码,后台报sql参数异常错误。
三:修改代码
查看API,发现Types类,此类中的getProperData
(byte type, java.lang.String val)
方法,
可以将字符串按照类型转为相应Object,所以我们只要是知道参数类型,然后做相应转化即可,最终,我们只需要将上面测试代码中的cxt.setParamValue(paramOrMocrName,strs);修改为cxt.setParamValue(paramOrMocrName,Types.getProperData(pmd.getParam(i).getDataType(),strs) )即可。
四:修改后运行结果
五:总结
数据类型是一个需要注意的地方,如果数据类型出错,整个程序就会出问题,这里也是很难注意到的地方,现在专门写出来,希望大家能够注意。