В настоящее время я устал пытаться исправить эту проблему в 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;
}
}
}
}
}
Каждое другое решение, которое я пробовал, не работает вообще.