后台传递参数时设置数据类型

在实际项目需求中,参数的灵活运用至关重要,集智数据平台提供了参数模板和报表模板,节省了用户写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) )即可。

四:修改后运行结果

五:总结

数据类型是一个需要注意的地方,如果数据类型出错,整个程序就会出问题,这里也是很难注意到的地方,现在专门写出来,希望大家能够注意。