Подтвердить что ты не робот

Кристаллические отчеты ApplyLogOnInfo никогда не работает

В настоящее время я устал пытаться исправить эту проблему в Crystal Reports. У нас есть 3 среды, разработка, развертывание на производственных (совместно используемых) и локальных компьютерах. Если я не буду точно соответствовать производственной среде в разработке, Crystal Reports никогда не будет показывать отчеты. Я провел огромные исследования на всех форумах, и я пробовал каждое решение. Не имеет значения, что я пытаюсь, когда я пытаюсь применить новую информацию о входе в систему, она никогда не работает, она просто терпит неудачу в конце, когда я запускаю таблицы для проверки соединения:

foreach (CrystalDecisions.CrystalReports.Engine.Table table in document.Database.Tables)
{
    TableLogOnInfo tableLogOnInfo = table.LogOnInfo;

    tableLogOnInfo.ConnectionInfo = info.ConnectionInfo;
    table.ApplyLogOnInfo(tableLogOnInfo);
    if (!table.TestConnectivity())
    {
        string msg = ("Failed to apply log in info for Crystal Report");
        throw new ApplicationException(msg);
    }
}

Если я изменю пароль или пароль для недопустимого, то он не сработал ранее в SetConnection или SetDatabaseLogon. Я знал, что произошла ошибка, из-за которой я не могу перейти от интегрированной безопасности к неинтегрированной системе безопасности, поэтому я установил свою собственную базу данных для использования обычных учетных данных пользователя и пароля.

Я могу ясно видеть, что соединения не установлены, потому что на моем компьютере разработки я установил неверный пароль, он терпит неудачу, но если я продолжу, я увижу отчет. На производственных компьютерах он всегда терпит неудачу, и он также не отображает отчет (пропуская ошибку для целей отладки). Таким образом, соединение жестко закодировано и его нельзя изменить.

Есть идеи? Я могу опубликовать весь код для изменения информации о соединении, но я думаю, что это не стоит, это хорошо известно.

Решение

Как многие люди говорили мне, нет ни одного решения. Кажется, в зависимости от версии Crystal Reports она работает по-разному. В моем случае для Crystal Reports 10.5.3700 работало следующее решение.

public static void CrystalReportLogOn(ReportDocument reportParameters, string serverName, string databaseName, string userName, string password)
{
    TableLogOnInfo logOnInfo;
    ReportDocument subRd;
    Sections sects;
    ReportObjects ros;
    SubreportObject sro;

    if (reportParameters == null)
    {
        throw new ArgumentNullException("reportParameters");
    }

    try
    {
        foreach (CrystalDecisions.CrystalReports.Engine.Table t in reportParameters.Database.Tables)
        {
            logOnInfo = t.LogOnInfo;
            logOnInfo.ReportName = reportParameters.Name;
            logOnInfo.ConnectionInfo.ServerName = serverName;
            logOnInfo.ConnectionInfo.DatabaseName = databaseName;
            logOnInfo.ConnectionInfo.UserID = userName;
            logOnInfo.ConnectionInfo.Password = password;
            logOnInfo.TableName = t.Name;
            t.ApplyLogOnInfo(logOnInfo);
            t.Location = t.Name;
        }
    }
    catch
    {
        throw;
    }

    sects = reportParameters.ReportDefinition.Sections;
    foreach (Section sect in sects)
    {
        ros = sect.ReportObjects;
        foreach (ReportObject ro in ros)
        {
            if (ro.Kind == ReportObjectKind.SubreportObject)
            {
                sro = (SubreportObject)ro;
                subRd = sro.OpenSubreport(sro.SubreportName);
                try
                {
                    foreach (CrystalDecisions.CrystalReports.Engine.Table t in subRd.Database.Tables)
                    {
                        logOnInfo = t.LogOnInfo;
                        logOnInfo.ReportName = reportParameters.Name;
                        logOnInfo.ConnectionInfo.ServerName = serverName;
                        logOnInfo.ConnectionInfo.DatabaseName = databaseName;
                        logOnInfo.ConnectionInfo.UserID = userName;
                        logOnInfo.ConnectionInfo.Password = password;
                        logOnInfo.TableName = t.Name;
                        t.ApplyLogOnInfo(logOnInfo);
                    }
                }
                catch
                {
                    throw;
                }
            }
        }
    }
}

Каждое другое решение, которое я пробовал, не работает вообще.

4b9b3361

Ответ 1

У меня была аналогичная проблема. Это важно, какую версию отчетов Crystal вы используете. Для некоторых версий, если вы установили расположение таблицы в дополнение к ApplyLogOnInfo, отчет будет работать.

Вы пытаетесь установить соединение с отчетами во время выполнения или у вас также есть отдельные отчеты для разных сред? Мы обнаружили, что легче создавать разные среды отчетов (но у нас всего 2: разработка и производство). Это позволило нам установить информацию о соединении - когда мы перемещаем отчеты от разработки к производству. У нас было мало встроенных инструментов, которые занимались различными версиями отчетов. Теперь мы используем этот сторонний инструмент: http://www.r-tag.com/Pages/CRDataSource.aspx Кажется, что он правильно обрабатывает все версии, но работает только для одного соединения для каждого отчета.