Dynamically set Crystal Report still asks for db l

2019-03-04 15:02发布

I am trying to deploy Crystal Reports in my MVC application. To get full use of the Crystal Report Viewer, I have to use a webform, which is working fairly well in my dev environment.

The application will be deployed on the user's servers and connect to their personal dbs. This means I do not have the final connection information when designing the report or the application.

I am able to successfully connect using their entries in the web.config file, load a DataTable with the report information, and pass it to the report. However, the report is still asking for the db credentials. The report is set to connect to my db, so it asks for my credentials and will not proceed without them. However, the final report shows the correct info from their db.

I am not sure if I need to change something in the report, or in the code behind. This is how I am setting the report ReportSource now:

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>");
    }
}

How do I prevent the report from asking for the original credentials?

EDIT:

If I pass the login to my db like this:

rd.SetDatabaseLogon("username", "password");

I do not get the db login again. The credentials have to be for the db used to create the report, but the displayed results are from the DataTable populated in the method above. If it has the data it needs from the current db, why does it need to connect to the original db?

EDIT2:

I have 2 data sources for this report. One is a table from the db and the other is the result from a stored procedure. I have now learned that is the cause of the extra login.

2条回答
虎瘦雄心在
2楼-- · 2019-03-04 15:11

You have to provide credentials for each datasouce in the report.

Ideally, the report will have a single datasource. If this is not possible, you need to provide credentials for each, or data for each.

Something like this works well if you want to provide the data:

rd.Database.Tables[0].SetDataSource(testDt);
rd.Database.Tables[1].SetDataSource(micssys);

Otherwise, something like this will allow the report to access the db directly for each datasource:

rd.SetDatabaseLogon("username","password}");
查看更多
放荡不羁爱自由
3楼-- · 2019-03-04 15:29

Have a look at my Blog post here on this.

There are a couple of actions required, but the main one is to create a new TableLogOnInfo instance, and then apply is using ApplyLogOnInfo.

查看更多
登录 后发表回答