在Sharepoint中加载水晶报表时我们常会遇到跳出水晶报表的登录界面,并且有时我们加载的报表可能会使用不同的数据库联接,而我们又需要在同一界面上对不同的报表进行处理。
一、为去掉这个登录界面并实现统一处理不同数据库联接的报表,我们写下如下模块
要使用ConfigurationManager记得先引用 using System.Configuration;
protected
void
LoginReportDataBase(CrystalDecisions.CrystalReports.Engine.ReportDocument report)
{
string serverName1 = ConfigurationManager.AppSettings[ " CrDBServerName1 " ];
string userId1 = ConfigurationManager.AppSettings[ " CrDBUserID1 " ];
string passWord1 = ConfigurationManager.AppSettings[ " CrDBPassWord1 " ];
string dataBaseName1 = ConfigurationManager.AppSettings[ " CrDBbaseName1 " ];
string serverName2 = ConfigurationManager.AppSettings[ " CrDBServerName2 " ];
string userId2 = ConfigurationManager.AppSettings[ " CrDBUserID2 " ];
string passWord2 = ConfigurationManager.AppSettings[ " CrDBPassWord2 " ];
string dataBaseName2 = ConfigurationManager.AppSettings[ " CrDBbaseName2 " ];
// Set Database Logon to main report
foreach (CrystalDecisions.Shared.IConnectionInfo connection in report.DataSourceConnections)
{
if (connection.DatabaseName == dataBaseName1 && connection.ServerName == serverName1)
{
connection.SetLogon(userId1 , passWord1);
}
if (connection.DatabaseName == dataBaseName2 && connection.ServerName == serverName2)
{
connection.SetLogon(userId2, passWord2);
}
}
// Set Database Logon to subreport
foreach (CrystalDecisions.CrystalReports.Engine.ReportDocument subreport in report.Subreports)
{
foreach (CrystalDecisions.Shared.IConnectionInfo connection in subreport.DataSourceConnections)
{
if (connection.DatabaseName == dataBaseName1 && connection.ServerName == serverName1)
{
connection.SetLogon(userId1 , passWord1);
}
if (connection.DatabaseName == dataBaseName2 && connection.ServerName == serverName2)
{
connection.SetLogon(userId2, passWord2);
}
}
}
}
{
string serverName1 = ConfigurationManager.AppSettings[ " CrDBServerName1 " ];
string userId1 = ConfigurationManager.AppSettings[ " CrDBUserID1 " ];
string passWord1 = ConfigurationManager.AppSettings[ " CrDBPassWord1 " ];
string dataBaseName1 = ConfigurationManager.AppSettings[ " CrDBbaseName1 " ];
string serverName2 = ConfigurationManager.AppSettings[ " CrDBServerName2 " ];
string userId2 = ConfigurationManager.AppSettings[ " CrDBUserID2 " ];
string passWord2 = ConfigurationManager.AppSettings[ " CrDBPassWord2 " ];
string dataBaseName2 = ConfigurationManager.AppSettings[ " CrDBbaseName2 " ];
// Set Database Logon to main report
foreach (CrystalDecisions.Shared.IConnectionInfo connection in report.DataSourceConnections)
{
if (connection.DatabaseName == dataBaseName1 && connection.ServerName == serverName1)
{
connection.SetLogon(userId1 , passWord1);
}
if (connection.DatabaseName == dataBaseName2 && connection.ServerName == serverName2)
{
connection.SetLogon(userId2, passWord2);
}
}
// Set Database Logon to subreport
foreach (CrystalDecisions.CrystalReports.Engine.ReportDocument subreport in report.Subreports)
{
foreach (CrystalDecisions.Shared.IConnectionInfo connection in subreport.DataSourceConnections)
{
if (connection.DatabaseName == dataBaseName1 && connection.ServerName == serverName1)
{
connection.SetLogon(userId1 , passWord1);
}
if (connection.DatabaseName == dataBaseName2 && connection.ServerName == serverName2)
{
connection.SetLogon(userId2, passWord2);
}
}
}
}
当然,我们需要在网站的ApplicationSetting中添加如下设置,来保证我们在后台代码中获取我们需要取得配置信息:
<
appSettings
>
< add key ="CrDBServerName1" value ="数据库服务器1" />
< add key ="CrDBbaseName1" value ="你的数据库名1" />
< add key ="CrDBUserID1" value ="sa1" />
< add key ="CrDBPassWord1" value ="sa1Pwd1" />
< add key ="CrDBServerName2" value ="数据库服务器2" />
< add key ="CrDBbaseName2" value ="你的数据库名2" />
< add key ="CrDBUserID2" value ="sa2" />
< add key ="CrDBPassWord2" value ="sa1Pwd2" />
</ appSettings >
< add key ="CrDBServerName1" value ="数据库服务器1" />
< add key ="CrDBbaseName1" value ="你的数据库名1" />
< add key ="CrDBUserID1" value ="sa1" />
< add key ="CrDBPassWord1" value ="sa1Pwd1" />
< add key ="CrDBServerName2" value ="数据库服务器2" />
< add key ="CrDBbaseName2" value ="你的数据库名2" />
< add key ="CrDBUserID2" value ="sa2" />
< add key ="CrDBPassWord2" value ="sa1Pwd2" />
</ appSettings >
准备工作完成后,调用我们的登录处理模块:
ReportDocument crdoc
=
new
ReportDocument();
string retLoadStr = "" ;
try
{
crdoc.Load( " ~/Testtemp/MyCrystalReport.rpt " );
// crdoc.SetDatabaseLogon("sa", "sapwd111", "cryDbServer", "SalesDetails");
LoginReportDataBase(crdoc);
this .CrystalReportViewerStm.ReportSource = crdoc;
CrystalReportViewerStm.HasRefreshButton = true ;
CrystalReportViewerStm.AutoDataBind = true ;
this .CrystalReportViewerStm.DataBind();
CrystalReportViewerStm.BestFitPage = true ;
retLoadStr = " OK " ;
}
catch (Exception ex)
{
retLoadStr = ex.ToString();
}
string retLoadStr = "" ;
try
{
crdoc.Load( " ~/Testtemp/MyCrystalReport.rpt " );
// crdoc.SetDatabaseLogon("sa", "sapwd111", "cryDbServer", "SalesDetails");
LoginReportDataBase(crdoc);
this .CrystalReportViewerStm.ReportSource = crdoc;
CrystalReportViewerStm.HasRefreshButton = true ;
CrystalReportViewerStm.AutoDataBind = true ;
this .CrystalReportViewerStm.DataBind();
CrystalReportViewerStm.BestFitPage = true ;
retLoadStr = " OK " ;
}
catch (Exception ex)
{
retLoadStr = ex.ToString();
}
运行一下,发现登录界面没有了,水晶报表出来了。
二、如果要在运行时自动从旧的数据库服务器和数据库切换新的数据库服务器和新的数据库
参考采用如下代码:
protected
void
ShiftLoginReportDataBase()
{
ReportDocument crdoc = new ReportDocument();
string oldServerName = " OldServer " ;
string newServerName = " NewServer " ;
string oldDatabaseName = " OldDatabase " ;
string newDatabaseName = " NewDatabase " ;
string userID = " UserID " ;
string password = " Password " ;
crdoc.Load( " ~/Testtemp/MyCrystalReport.rpt " );
// Change the server name and database in main reports
foreach (CrystalDecisions.Shared.IConnectionInfo connection in crdoc.DataSourceConnections)
{
if ((String.Compare(connection.ServerName, oldServerName, true ) == 0 ) && (String.Compare(connection.DatabaseName, oldDatabaseName, true ) == 0 ))
{
// SetConnection can also be used to set new logon and new database table
crdoc.DataSourceConnections[oldServerName, oldDatabaseName].SetConnection(newServerName, newDatabaseName, userID, password);
}
}
// Change the server name and database in subreport
foreach (CrystalDecisions.CrystalReports.Engine.ReportDocument subReport in crdoc.Subreports)
{
foreach (CrystalDecisions.Shared.IConnectionInfo connection in subReport.DataSourceConnections)
{
if ((String.Compare(connection.ServerName, oldServerName, true ) == 0 ) && (String.Compare(connection.DatabaseName, oldDatabaseName, true ) == 0 ))
{
// SetConnection can also be used to set new logon and new database table
subReport.DataSourceConnections[oldServerName, oldDatabaseName].SetConnection(newServerName, newDatabaseName, userID, password);
}
}
}
}
{
ReportDocument crdoc = new ReportDocument();
string oldServerName = " OldServer " ;
string newServerName = " NewServer " ;
string oldDatabaseName = " OldDatabase " ;
string newDatabaseName = " NewDatabase " ;
string userID = " UserID " ;
string password = " Password " ;
crdoc.Load( " ~/Testtemp/MyCrystalReport.rpt " );
// Change the server name and database in main reports
foreach (CrystalDecisions.Shared.IConnectionInfo connection in crdoc.DataSourceConnections)
{
if ((String.Compare(connection.ServerName, oldServerName, true ) == 0 ) && (String.Compare(connection.DatabaseName, oldDatabaseName, true ) == 0 ))
{
// SetConnection can also be used to set new logon and new database table
crdoc.DataSourceConnections[oldServerName, oldDatabaseName].SetConnection(newServerName, newDatabaseName, userID, password);
}
}
// Change the server name and database in subreport
foreach (CrystalDecisions.CrystalReports.Engine.ReportDocument subReport in crdoc.Subreports)
{
foreach (CrystalDecisions.Shared.IConnectionInfo connection in subReport.DataSourceConnections)
{
if ((String.Compare(connection.ServerName, oldServerName, true ) == 0 ) && (String.Compare(connection.DatabaseName, oldDatabaseName, true ) == 0 ))
{
// SetConnection can also be used to set new logon and new database table
subReport.DataSourceConnections[oldServerName, oldDatabaseName].SetConnection(newServerName, newDatabaseName, userID, password);
}
}
}
}
相关链接: Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据 一)
相关链接: Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示数据 二)相关链接: Sharepoint学习笔记---如何在Sharepoint2010网站中整合Crystal Report水晶报表(显示图片)