C# 动态设置Crystal Report仍要求数据库登录
我正在尝试在我的C# 动态设置Crystal Report仍要求数据库登录,c#,asp.net-mvc,visual-studio-2010,crystal-reports,C#,Asp.net Mvc,Visual Studio 2010,Crystal Reports,我正在尝试在我的MVC应用程序中部署Crystal Reports。为了充分利用Crystal Report Viewer,我必须使用webform,它在我的开发环境中工作得相当好 应用程序将部署在用户的服务器上,并连接到用户的个人数据库。这意味着在设计报表或应用程序时,我没有最终的连接信息 我能够使用web.config文件中的条目成功连接,加载带有报告信息的DataTable,并将其传递给报告。但是,报告仍要求提供db凭据。报告已设置为连接到我的数据库,因此它要求提供我的凭据,如果没有凭据,
MVC
应用程序中部署Crystal Reports
。为了充分利用Crystal Report Viewer,我必须使用webform
,它在我的开发环境中工作得相当好
应用程序将部署在用户的服务器上,并连接到用户的个人数据库。这意味着在设计报表或应用程序时,我没有最终的连接信息
我能够使用web.config文件中的条目成功连接,加载带有报告信息的DataTable
,并将其传递给报告。但是,报告仍要求提供db凭据。报告已设置为连接到我的数据库,因此它要求提供我的凭据,如果没有凭据,将无法继续。但是,最终报告显示了来自其数据库的正确信息
我不确定是否需要更改报告中的某些内容,或者是否需要更改隐藏的代码。这就是我现在如何设置报表ReportSource
:
protected void Page_Load(object sender, EventArgs e)
{
string strReportName = System.Web.HttpContext.Current.Session["ReportName"].ToString();
try
{
ReportDocument rd = new ReportDocument();
string strRptPath = Server.MapPath("~/") + "Rpts//" + strReportName;
rd.Load(strRptPath);
SqlParameter[] sqlParams = {};
DataTable testDt = DBHelper.GetTable("rptInvtDuplDesc", sqlParams);
rd.DataSourceConnections.Clear();
rd.SetDataSource(testDt);
CrystalReportViewer1.ReportSource = rd;
}
else
{
Response.Write("<H2>Nothing Found; No Report name found</H2>");
}
}
我无法再次登录数据库。凭证必须是用于创建报告的数据库的凭证,但显示的结果来自上面方法中填充的DataTable
。如果它拥有当前数据库中所需的数据,为什么需要连接到原始数据库
EDIT2:
本报告有两个数据源。一个是数据库中的表,另一个是存储过程的结果。我现在了解到这是额外登录的原因。看看我在这方面的博客文章
需要执行两个操作,但主要操作是创建一个新的
TableLogOnInfo
实例,然后使用ApplyGonInfo
应用。您必须为报告中的每个datasouce
提供凭据
理想情况下,报告将有一个数据源。如果不可能,则需要为每个提供凭据,或为每个提供数据
如果您想提供数据,这种方法很有效:
rd.Database.Tables[0].SetDataSource(testDt);
rd.Database.Tables[1].SetDataSource(micssys);
否则,类似这样的内容将允许报表直接访问每个数据源的db
:
rd.SetDatabaseLogon("username","password}");
我将不得不尝试另一个CR
问题。对于这个问题,我已经使用了C#
来获取报告中所需的数据,为什么我必须再次登录数据库?根据我的经验,CR
不太擅长处理大数据,我宁愿使用更好的工具。我希望我可以简单地将报告用于演示,而不是用于任何数据收集或处理。我了解到问题在于我有两个表为报告提供数据。现在,我可以使用(rd.Database.Tables[0].SetDataSource(testDt);)为每个表设置DataSource,但是表名似乎被交换了。如何使用SetDataSource强制表名?有什么想法吗?
rd.SetDatabaseLogon("username","password}");