问题来由:
当通过表单提交信息给报表服务时,当参数值大于2k时,这时如果加入显示工具条参数时,ie会返回该页无法显示这样的错误信息,而如果不加显示工具条参数时,结果正常,但是就是没有工具条
问题反馈:
据微软的专家说这是sql2000/sql2005的bug,真是奇怪了,sql2005研究了5年才发布,居然这一bug依然保留,可以想象这是多么大的一个技术难题
解决思路:
据微软提供的建议,建议编写一个自定义的报表工具条
解决办法:
首先确定报表工具条的作用,它的作用是用于翻页和导出报表数据到其它类型的文档
可以看出,技术难点在于翻页,也就是当前报表总页数的获取
那么如何才能获得带指定参数的指定报表的页数呢?微软的建议是通过报表服务的web服务接口来获取,当服务器上装了报表服务时,也就相应的存在了报表服务的web服务接口,一般访问地址如下:
http://****/reportserver/reportservice.asmx
通过这一公开的web服务,调用其相应功能可以实现报表服务的n多的功能,获取页数只是其中微不足道的功能之一,实现代码如下:
public int getnumber()
{
string
string[] parameters=_parameter.split('&');
int parameternumber=parameters.length;
rs.parametervalue[] param=new reportnumber.rs.parametervalue[parameternumber];
for(int i=0;i<parameternumber;i++)
{
string[] p=parameters[i].split('=');
param[i]=new parametervalue();
param[i].name=p[0];
param[i].value=p[1];
}
rs.reportingservice rs=new reportnumber.rs.reportingservice();
[email protected]"/reportservice.asmx";
/*
注意,如果你的报表服务器和应用服务器不处于同一机器,那么你必须提供访问报表服务器的凭证,如下面的凭证是通过使用negotiate 验证来传送用户名、密码
当然,如果2个服务器在同一台机器,那就非常简单了,直接使用本地凭证验证即可
*/
credentialcache cache = new credentialcache();
cache.add(new uri(rs.url), "negotiate", new networkcredential("administrator", "crserver", ""));
rs.credentials = cache;
/*
rs.credentials=system.net.credentialcache.defaultcredentials;
*/
datasourcecredentials[] credentials=null;
string showhidetoggle=null;
string encoding;
string mimetype;
warning[] warnings=null;
parametervalue[] reporthistoryparameters=null;
string[] streamids=null;
sessionheader sh=new sessionheader();
rs.sessionheadervalue=sh;
string historyid=null;
byte[] result=rs.render(reportname,"html4.0",historyid,deviceinfo,param,credentials,showhidetoggle,out encoding,out mimetype,out reporthistoryparameters,out warnings,out streamids);
string s=system.text.utf8encoding.utf8.getstring(result,0,result.length-1);
string [email protected]"<hr/>";
regex regex=new regex(r);
matchcollection mc=regex.matches(s);
return mc.count+1;
}
新闻热点
疑难解答