問題來由:
當通過表單提交信息給報表服務時,當參數值大于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;
}
新聞熱點
疑難解答