-1

We are using Crystal Reports 2011 & SQL Server 2008 (Windows 7 64 bit). Whenever I try to deploy the crystal reports in the IIS it is always prompting enter the database login information. I have tried the below options

  1. Set the login information in the code
  2. Set IIS app pool to LocalService

Nothing works. Here is the code

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ConfigureCrystalReports();
        }
        else
        {
            ReportDocument doc = Session["Report"] as ReportDocument;
            SetLogon(doc);
            CrystalReportViewer1.ReportSource = doc;
            CrystalReportViewer1.RefreshReport();
        }
    }

    private void ConfigureCrystalReports()
    {

        ReportDocument reportDoc;
        if (!IsPostBack)
        {
            reportDoc = new ReportDocument();
            reportDoc.Load(Server.MapPath("~/Sample.rpt"));
            Session.Add("Report", reportDoc);
        }
        else
        {
            reportDoc = Session["Report"] as ReportDocument;
        }

        SetLogon(reportDoc);

        CrystalReportViewer1.ReportSource = reportDoc;
        CrystalReportViewer1.RefreshReport();
    }

    private void SetLogon(ReportDocument reportDoc)
    {
        var connectionInfo1 = new ConnectionInfo()
        {
            ServerName = @"ODBCDSN",
            DatabaseName = "hrdw_old",
            IntegratedSecurity = true
        };

        SetDBLogonForReport(connectionInfo1, reportDoc);
    }

    private void SetDBLogonForReport(ConnectionInfo connectionInfo1, ReportDocument reportDocument)
    {
        Tables tables = reportDocument.Database.Tables;
        foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
        {
            TableLogOnInfo tableLogonInfo = table.LogOnInfo;

            tableLogonInfo.ConnectionInfo = connectionInfo1;
            tableLogonInfo.ConnectionInfo.Type = ConnectionInfoType.SQL;
            table.ApplyLogOnInfo(tableLogonInfo);


        }
        reportDocument.SetDatabaseLogon(connectionInfo1.UserID, connectionInfo1.Password);
    }
}

Steps tried in IIS: Application pool: ASP.NET 4.0 Default app pool Also enabled Windows Authentication in IIS & disabled anonymous authentication. Tried anonymous authentication only. SQL Server has both windows and sql server authentication.

I will not be able to use dataset since the crystal reports will be developed by someone using command objects. It works perfectly good in the Visual studio 2010 environment. But doesnt work in IIS.

Am I missing something basic? Any help is appreciated.

Thanks

Shankar.

4

1 回答 1

1

这是如何解决的。这是一个解决方法

CrystalDecisions.ReportAppServer.ClientDoc.ISCDReportClientDocument rptClientDoc = doc.ReportClientDocument;

        CrystalDecisions.ReportAppServer.ClientDoc.ISCDReportClientDocument rcd = rptClientDoc;

        string server = @"<SERVER>";
        string db = "<DATABASE>";
        string user = "<USER>";
        string pass = "PASSWORD";

        rptClientDoc.DatabaseController.LogonEx(server, db, user, pass);

        //Create the logon propertybag for the connection we wish to use
        CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag logonDetails = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag();
        logonDetails.Add("Auto Translate", -1);
        logonDetails.Add("Connect Timeout", 15);
        logonDetails.Add("Data Source", server);
        logonDetails.Add("General Timeout", 0);
        logonDetails.Add("Initial Catalog", db);
        logonDetails.Add("Integrated Security", "false");
        logonDetails.Add("Locale Identifier", 1033);
        logonDetails.Add("OLE DB Services", -5);
        logonDetails.Add("Provider", "SQLOLEDB");
        logonDetails.Add("Use Encryption for Data", 0);

        //Create the QE (query engine) propertybag with the provider details and logon property bag.
        CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag QE_Details = new CrystalDecisions.ReportAppServer.DataDefModel.PropertyBag();
        QE_Details.Add("Database DLL", "crdb_ado.dll");
        QE_Details.Add("QE_DatabaseName", db);
        QE_Details.Add("QE_DatabaseType", "OLE DB (ADO)");
        QE_Details.Add("QE_LogonProperties", logonDetails);
        QE_Details.Add("QE_ServerDescription", server);
        QE_Details.Add("QE_SQLDB", "True");
        QE_Details.Add("SSO Enabled", "False");

        CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo newConnInfo = new CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo();
        CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfo oldConnInfo;
        CrystalDecisions.ReportAppServer.DataDefModel.ConnectionInfos oldConnInfos;

        oldConnInfos = rcd.DatabaseController.GetConnectionInfos(null);
        for (int I = 0; I < oldConnInfos.Count; I++)
        {
            oldConnInfo = oldConnInfos[I];
            newConnInfo.Attributes = QE_Details;
            newConnInfo.Kind = CrystalDecisions.ReportAppServer.DataDefModel.CrConnectionInfoKindEnum.crConnectionInfoKindCRQE;
            try
            {
                rcd.DatabaseController.ReplaceConnection(oldConnInfo, newConnInfo, null, CrystalDecisions.ReportAppServer.DataDefModel.CrDBOptionsEnum.crDBOptionDoNotVerifyDB);
            }
            catch (Exception ex)
            {
                Label1.Text = ex.Message;
                return;
            }

        }

        doc.SetDatabaseLogon(user, pass);

为了确保一开始根本没有登录提示,我必须登录到控制器,然后设置所有登录凭据。确保在回发期间也重复使用登录凭据。完成此操作后,也可以使用报告文档登录。这解决了登录提示一次又一次的问题。

谢谢

尚卡尔

于 2013-06-03T22:55:03.557 回答