現時点では、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;
}
}
}
}
}
私が試した他のすべてのソリューションはまったく機能しませんでした。