Crystal Reports Reportviewer - динамически не устанавливать источник данных: argh: - PullRequest
2 голосов
/ 25 марта 2010

Я использую CR XI и обращаюсь к файлам .RPT через ReportViewer на моих страницах ASP.NET.

Я уже получил следующий код, который должен динамически устанавливать источник данных отчета.

            rptSP = New ReportDocument
            Dim rptPath As String = Request.QueryString("report")
            rptSP.Load(rptPath.ToString, 0)
            Dim SConn As New System.Data.SqlClient.SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings("MyConnectionString").ConnectionString)
            rptSP.DataSourceConnections(SConn.DataSource, SConn.InitialCatalog).SetConnection(SConn.DataSource, SConn.InitialCatalog, SConn.UserID, SConn.Password)
            Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo
            myConnectionInfo.ServerName = SConn.DataSource
            myConnectionInfo.DatabaseName = SConn.InitialCatalog
            myConnectionInfo.UserID = SConn.UserID
            myConnectionInfo.Password = SConn.Password
            'Two new methods to loop through all objects and tables contained in the requested report and set
            'login credentials for each object and table.  
            SetDBLogonForReport(myConnectionInfo, rptSP)
            SetDBLogonForSubreports(myConnectionInfo, rptSP)


            Me.CrystalReportViewer1.ReportSource = rptSP

Но когда я захожу в каждый файл .RPT и открываю раздел «Эксперт базы данных», очевидно, что там все еще жестко прописаны имена серверов, и приведенный выше код, по-видимому, не способен изменить жестко закодированные имена серверов. .

Я говорю это, потому что у меня есть учебная и производственная среда. Когда файл .RPT жестко запрограммирован на моем производственном сервере, и я открываю его на своем обучающем сервере с помощью приведенного выше кода (и в файле подключения у web.config имеется обучающий сервер), я получаю ol:

Ссылка на объект не установлена ​​для экземпляра объекта.

А потом, если я захожу в файл .RPT, переключаю источник данных на обучающий сервер и пытаюсь открыть его снова, он работает нормально. Почему приведенный выше код не перезаписывает источник данных файлов .RPT?

Как мне избежать необходимости открывать каждый .RPT и изменять источник данных при переносе отчетов с сервера на сервер? Есть ли в файле .RPT параметр, который мне не хватает или что-то в этом роде?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2010

Вы вызываете метод Crystal ApplyLogOnInfo? Это фрагмент кода, который я использую, который отлично работает.

        //Set database details
        TableLogOnInfo oLogOn;
        foreach (CrystalDecisions.CrystalReports.Engine.Table tbCurrent in report.Database.Tables)
        {
            oLogOn = tbCurrent.LogOnInfo;
            oLogOn.ConnectionInfo.DatabaseName = databaseName;
            oLogOn.ConnectionInfo.UserID = userName;
            oLogOn.ConnectionInfo.Password = pwd;
            oLogOn.ConnectionInfo.ServerName = serverName;
            oLogOn.ConnectionInfo.Type = ConnectionInfoType.SQL;
            tbCurrent.ApplyLogOnInfo(oLogOn);
        }

Вы должны изменить report на rptSP

Спасибо

0 голосов
/ 22 июля 2011

У меня точно такая же проблема с кодом C #. У меня есть среда DEV и PROD, а источник данных жестко запрограммирован в DEV. Интересно, что у меня есть 5 отчетов, которые работают с использованием точно такого же кода, и 3, которые не работают. Я подумал, может быть, проверка базы данных и обновление базы данных дадут эффект, поскольку он не синхронизирует БД, и поэтому он не обновляет источник данных, но я сделал это, и все же мои три отчета не работают. Не уверен, что сейчас это код, потому что мои 5 отчетов, использующие точный код, работают.

            addParametersToFields("inst", inst, fields);
            addParametersToFields("reportSubTitle", reportSubTitle, fields);

            CrystalReportViewer1.ParameterFieldInfo = fields;
            rptDoc.Load(Server.MapPath(report));

            ConnectionInfo connectionInfo = Reports.GetConnectionInfo(server, database, "userID", "password");
            connectionInfo.IntegratedSecurity = true;

            connectionInfo.Type = ConnectionInfoType.SQL;
            SetDBLogonForReport(connectionInfo, env);
            CrystalReportViewer1.ReportSource = rptDoc;
        }
        catch (Exception e)
        {
        }
        finally
        {
        }

    }

  private void SetDBLogonForReport(ConnectionInfo oConnectionInfo, string env)
    {
        try
        {
            TableLogOnInfos oTableLogOnInfos = CrystalReportViewer1.LogOnInfo;
            string[] sparams = new string[]{
            };

            foreach (CrystalDecisions.CrystalReports.Engine.Table oTable in rptDoc.Database.Tables)
            {
                if (oTable.LogOnInfo.ConnectionInfo.ServerName == oConnectionInfo.ServerName)
                {
                    TableLogOnInfo oTableLogOnInfo = oTable.LogOnInfo;

                    oTableLogOnInfo.ConnectionInfo = oConnectionInfo;

                    oTable.ApplyLogOnInfo(oTableLogOnInfo);


                    bool b = oTable.TestConnectivity();

                    if (!b)
                    {
                        invokeErrorLogger(sparams, env);
                    }
                }
            }

        }
        catch
        {
            throw;
        }
    }
0 голосов
/ 29 марта 2010

Я знаю, это может показаться странным, но у меня возникли такие проблемы при использовании параметров с отчетами. Я должен был установить объект параметра, прежде чем установить значение для них.

Это может означать, что вам, возможно, потребуется настроить объект отчета на свой источник, прежде чем настраивать его. Вы когда-нибудь пробовали это?

...