星期一, 六月 18, 2007

SQL2005报表参数大于2K问题的终极解决方案 - 技术频道 | IT168 - 使用 Google 工具栏进行发送

SQL2005报表参数大于2K问题的终极解决方案 - 技术频道 | IT168

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

作者:AnyJack  2007-06-15

【IT168 技术文档】

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

    问题反馈:

    据微软的专家说这是SQL2000/SQL2005的BUG,真是奇怪了,SQL2005研究了5年才发布,居然这一BUG依然保留,可以想象这是多么大的一个技术难题。 

    解决思路:

    据微软提供的建议,建议编写一个自定义的报表工具条。

    解决办法: 

    首先确定报表工具条的作用,它的作用是用于翻页和导出报表数据到其它类型的文档。可以看出,技术难点在于翻页,也就是当前报表总页数的获取。那么如何才能获得带指定参数的指定报表的页数呢?微软的建议是通过报表服务的WEB服务接口来获取,当服务器上装了报表服务时,也就相应的存在了报表服务的WEB服务接口,一般访问地址如下: http://****/reportserver/reportservice.asmx

    通过这一公开的WEB服务,调用其相应功能可以实现报表服务的N多的功能,获取页数只是其中微不足道的功能之一,实现代码如下:

public int GetNumber()
... { string deviceinfo =@"<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();
rs.Url
= this ._url+@"/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 r =@"<hr/>";
Regex regex
=new Regex(r); MatchCollection mc=regex.Matches(s);
return mc.Count +1;
}