Crystal Reports 2011在asp.net中登录提示

时间:2013-05-30 01:38:53

标签: asp.net sql-server-2008 iis-7 crystal-reports

我们正在使用Crystal Reports 2011& SQL Server 2008(Windows 7 64位)。每当我尝试在IIS中部署水晶报告时,它总是提示输入数据库登录信息。我尝试过以下选项

  1. 在代码中设置登录信息
  2. 将IIS应用程序池设置为LocalService
  3. 没有任何作用。这是代码

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

    在IIS中尝试的步骤: 应用程序池:ASP.NET 4.0默认应用程序池 还启用了IIS中的Windows身份验证和禁用匿名身份验证。 仅尝试匿名身份验证。 SQL Server具有Windows和SQL Server身份验证。

    我将无法使用数据集,因为水晶报告将由使用命令对象的人开发。它在Visual Studio 2010环境中运行得非常好。但是在IIS中不起作用。

    我错过了一些基本的东西吗?任何帮助表示赞赏。

    由于

    香卡。

1 个答案:

答案 0 :(得分: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);

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

由于

香卡