Crystal Reports を使用する C# .NET WinForms アプリケーションがあります。サブレポートを含むレポートを除いて、Crystal レポートは x32 と x64 の両方のシステムで正常に動作します。サブレポートを含むすべてのレポートは、...VerifyDatabase() で "ログオンに失敗しました"というすばらしいメッセージで失敗しますが、x64 システムでのみ発生します。
過去にこの問題を確認し、すべての印刷で [データベースを検証] をオフにして、レポートにデータが保存されていないことを確認し、デザイナーで正しいドライバーと接続方法が使用されていることを確認しました。この問題は解消されておらず、サブレポートを含むレポートにのみ影響しているようです。
ソリューション内のすべてのプロジェクトは、x32 にビルドするように設定されています。x64 システムには、CR 32 ビット ランタイムがインストールされています。SQL Native Client もインストールされます。
データベースを検証しない、レポートを更新しない、検証して更新しない、更新して検証しないなど、さまざまなレポート準備手順の組み合わせを試しました...それは延々と続きます。
現在使用されている準備方法は次のとおりです。
private T GetReport<T>() where T: ReportDocument, new()
{
var report = new T();
var connectionStringBuilder
= new SqlConnectionStringBuilder(this.ConnectionString);
var connectionInfo = new ConnectionInfo
{
DatabaseName = connectionStringBuilder.InitialCatalog,
UserID = connectionStringBuilder.UserID,
Password = connectionStringBuilder.Password,
ServerName = connectionStringBuilder.DataSource
};
Action<ReportDocument, bool, bool> setConnection = (document, verify, refresh) =>
{
document.DataSourceConnections.Clear();
document.DataSourceConnections[0].SetConnection(
connectionStringBuilder.DataSource,
connectionStringBuilder.InitialCatalog,
connectionStringBuilder.UserID,
connectionStringBuilder.Password
);
document.DataSourceConnections[0].IntegratedSecurity = false;
/*
foreach (Table table in document.Database.Tables)
{
var tableLogOnInfo = table.LogOnInfo;
tableLogOnInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogOnInfo);
}
* */
//document.SetDatabaseLogon(connectionInfo.UserID, connectionInfo.Password, connectionInfo.ServerName, connectionInfo.DatabaseName);
if (verify)
document.VerifyDatabase();
if (refresh)
document.Refresh();
};
for (var index = 0; index < report.Subreports.Count; index++)
{
var subreportName = report.Subreports[index].Name;
var subreport = report.OpenSubreport(subreportName);
setConnection(subreport, false, false);
}
setConnection(report, true, true);
return report;
}
解決済み: レポートが機能するようになりました。このソリューションのどの部分が実際に問題を解決したかはわかりませんが、これらは私が取った手順です。
- 以下のaMazingの提案に従ってデータソースを確認しました. (すでにOLE DBでした)
- ソリューション内のすべてのプロジェクトで、Crystal Reports への参照をすべて削除しました。
- Crystal Reports の参照を再度追加し、すべての参照が同じバージョンであることを確認し、すべての参照が「特定のバージョン」= True に設定されていることを確認しました。
- ソリューション内の 1 つのプロジェクトの CR 参照で、'Copy Local' を True に設定しました。
- **setConnection** への呼び出しを検証しないように変更しました。
- foreach table.ApplyLogOnInfo(tableLogOnInfo) セクションのコメントを外しました。
なぜ今それが機能するのかはわかりませんが、機能します。table.ApplyLogOnInfo は、以前に試した多くの順列でコメント化されていませんでした。多分私はこの特定の組み合わせを打ったことはありません...しかし、私はこの時点で気にしません.