首页 > 开发 > 综合 > 正文

SQL2005报表参数大于2K问题的终极解决方案

2024-07-21 02:12:08
字体:
来源:转载
供稿:网友
 

问题来由:
 当通过表单提交信息给报表服务时,当参数值大于2k时,这时如果加入显示工具条参数时,ie会返回该页无法显示这样的错误信息,而如果不加显示工具条参数时,结果正常,但是就是没有工具条

问题反馈:
 据微软的专家说这是sql2000/sql2005的bug,真是奇怪了,sql2005研究了5年才发布,居然这一bug依然保留,可以想象这是多么大的一个技术难题

解决思路:
 据微软提供的建议,建议编写一个自定义的报表工具条

解决办法:
 首先确定报表工具条的作用,它的作用是用于翻页和导出报表数据到其它类型的文档
 可以看出,技术难点在于翻页,也就是当前报表总页数的获取
 那么如何才能获得带指定参数的指定报表的页数呢?微软的建议是通过报表服务的web服务接口来获取,当服务器上装了报表服务时,也就相应的存在了报表服务的web服务接口,一般访问地址如下:
 http://****/reportserver/reportservice.asmx
 通过这一公开的web服务,调用其相应功能可以实现报表服务的n多的功能,获取页数只是其中微不足道的功能之一,实现代码如下:
  public int getnumber()
  {
 
   string false[email protected]"<deviceinfo><toolbar>false</toolbar></deviceinfo>";
   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; 
 
 }    

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表