Crystal Report在发布时请求数据库登录

时间:2016-07-27 06:02:25

标签: c# wpf crystal-reports dialog database-connection

我正在开发一个WPF中的应用程序需要从中获取报告,我完成了它,在我的电脑中一切正常,没有出现数据库登录对话框,完全没问题。但是当我想在通过Crystal Report Viewer显示报告时在客户端PC中发布它时,会出现数据库登录对话框!我做了我想到的所有事情,并在网络上的各个地方搜索并尽力而为,但无法解决这个问题。 这是我的代码:

ReportDocument CryRpt1 = new ReportDocument();
string Path1 = System.Windows.Forms.Application.StartupPath + "\\CryReportSendItems.rpt";
CryRpt1.Load(Path1, OpenReportMethod.OpenReportByDefault);
AssignConnection(CryRpt1);
CryRpt1.Refresh();
Crv.ViewerCore.ReportSource = CryRpt1;

这是AssignConnection方法:

private void AssignConnection(ReportDocument rpt)
        {
            ConnectionInfo connection = new ConnectionInfo();        
            connection.ServerName = "*ServerName*";
            connection.DatabaseName = "*DBName*";
            connection.UserID = "*User*";
            connection.Password = "*Password*";

            foreach (CrystalDecisions.CrystalReports.Engine.Table table in rpt.Database.Tables)
            {
                AssignTableConnection(table, connection);
            }

            foreach (CrystalDecisions.CrystalReports.Engine.Section section in rpt.ReportDefinition.Sections)
            {

                foreach (CrystalDecisions.CrystalReports.Engine.ReportObject reportObject in section.ReportObjects)
                {
                    if (reportObject.Kind == ReportObjectKind.SubreportObject)
                    {
                        SubreportObject subReport = (SubreportObject)reportObject;
                        ReportDocument subDocument = subReport.OpenSubreport(subReport.SubreportName);

                        foreach (CrystalDecisions.CrystalReports.Engine.Table table in subDocument.Database.Tables)
                        {
                            AssignTableConnection(table, connection);
                        }

                        subDocument.SetDatabaseLogon(connection.UserID, connection.Password, connection.ServerName, connection.DatabaseName);
                    }
                }
            }
            rpt.SetDatabaseLogon(connection.UserID, connection.Password, connection.ServerName, connection.DatabaseName);
        }

        private void AssignTableConnection(CrystalDecisions.CrystalReports.Engine.Table table, ConnectionInfo connection)
        {
            // Cache the logon info block
            TableLogOnInfo logOnInfo = table.LogOnInfo;

            connection.Type = logOnInfo.ConnectionInfo.Type;

            // Set the connection
            logOnInfo.ConnectionInfo = connection;

            // Apply the connection to the table!

            table.LogOnInfo.ConnectionInfo.DatabaseName = connection.DatabaseName;
            table.LogOnInfo.ConnectionInfo.ServerName = connection.ServerName;
            table.LogOnInfo.ConnectionInfo.UserID = connection.UserID;
            table.LogOnInfo.ConnectionInfo.Password = connection.Password;
            table.LogOnInfo.ConnectionInfo.Type = connection.Type;
            table.ApplyLogOnInfo(logOnInfo);
        }

*注意:我的Windows版本是10(x64),客户端Windows版本是7(x64)。

有些人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我找到了答案,也许有人会用这个:

使用Entity Framework在代码中再次填写报告。

        using (var db = new DatabaseContext())
        {
            CryRpt1.SetDataSource(db.VwSendItems);
        }

之前:

        SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder("Data Source=*Server*;Initial Catalog=*DBCenter*;Persist Security Info=True;User ID=*User*;password=*Password*");  //from config.xml
        crConnectionInfo.ServerName = builder.DataSource;
        crConnectionInfo.DatabaseName = builder.InitialCatalog;
        crConnectionInfo.IntegratedSecurity = true;

        CrTables = CryRpt1.Database.Tables;
        foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables)
        {
            crtableLogoninfo = CrTable.LogOnInfo;
            crtableLogoninfo.ConnectionInfo = crConnectionInfo;
            CrTable.ApplyLogOnInfo(crtableLogoninfo);
        }

        //AssignConnection(CryRpt1);
        ConnectionInfo connection = new ConnectionInfo
        {
            ServerName = "10.20.1.41",
            DatabaseName = "DBCenterMostafavi",
            UserID = "site",
            Password = "123!@#a"
        };
        CryRpt1.SetDatabaseLogon(connection.UserID, connection.Password, connection.ServerName, connection.DatabaseName);

        foreach (CrystalDecisions.CrystalReports.Engine.Table table in CryRpt1.Database.Tables)
        {
            AssignTableConnection(table, connection);
        }

就是这样。