背景
最近のプロジェクトでは、スケジュールされたタスクのCrystal Reports生成されたPDFファイルで、背景に需要を満たし、その後、関係者にメッセージを送信します。
アイデアの技術的実現
(バージョン2.2に基づいて)選択ASP.NETコアフレームワークは、タイミングタスクIHostedService結合インターフェイスクォーツを達成します。しかし、現在のCrystal Reports SDKのみフレームワークフレームワークをサポートしているのために、ASP.NETコアは、.NET Framework 4.7に基づいて選ばれました。ASP.NETのコア機能でクォーツ定期的なタスクの統合で、それはデフォルトホスティングIISので、特に特定の注意することは、それらを繰り返して、アプリケーションプールのリサイクルの問題を引き起こす可能性があり、正規につながる、技術の多くのブログの庭でいない掲載されていますIISホスティングので、あなたがのアプリケーションプールを設定する必要がある場合は、タスクが終了すると、启动模式
値をAlwaysRunning
、闲置超时
値が設定されています0
。
Crystal Reportsの使用方法ということに焦点を当て、身近には、以下。
Crystal ReportsのVS開発キットをダウンロードして、アドレス:https://www.crystalreports.com/crvs/confirm/
RPT Crystalレポートテンプレートファイルを取得します。
コーディングエクスポート機能
コーディング
2つのアセンブリを参照する最初の必要性:CrystalDecisions.CrystalReports.Engine``CrystalDecisions.Shared
メインのコード・ロジック・パッケージ
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace CrontabService.Services.report
{
public class CrystalReportGenerator
{
private ReportDocument _rd;
private readonly ILogger<PurchaseNotifyMsgCreatorService> _logger;
public CrystalReportGenerator(string templatePath, ConnectionInfo connectionInfo, ILogger<PurchaseNotifyMsgCreatorService> logger)
{
_logger = logger;
TableLogOnInfo t = new TableLogOnInfo();
t.ConnectionInfo = connectionInfo;
_rd = new ReportDocument();
_rd.Load(templatePath);
foreach (Table table in _rd.Database.Tables)
{
table.ApplyLogOnInfo(t);
}
}
public string GenerateReport(Dictionary<string,object> paras,string reportFileName)
{
try
{
foreach (var kv in paras)
{
_rd.SetParameterValue(kv.Key, kv.Value);
}
var reportPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"report\" + reportFileName);
//导出为pdf格式
_rd.ExportToDisk(ExportFormatType.PortableDocFormat, reportPath);
return reportPath;
}
catch (Exception e)
{
_logger?.LogError(e, "GenerateReport error");
}
}
}
}
主に内部情報データベースであるConnectionInfoクラス、次の再適用データベース接続情報、または時間のエクスポートをテーブルに適用する必要このレポートは、エラーメッセージは、データベース接続の失敗を表示します
Crystal Reportsは2つのデータソースがある取得するための2つの方法があるため:push
、pull
プッシュが積極的に設定データソースを符号化され、メソッド呼び出しSetDataSource
のどちらか、彼は、データベースの情報に私を得たことを維持し、そのデータソース情報テンプレートに基づいて、プルレポートを。
Iこれは、レポートを生成するためのバックグラウンドタスクであるため、何reportviewコントロールが存在しないので、私は問題が発生しているこれは、私がデータソースを取得するSetDataSourceの方法で持つようになった、実行ExportToDisk方法の結果は、データベース接続を示唆し、例外がスローされますフェイルは、その後、オンラインなので、プルモードは、データベース接続、およびレポートテンプレートのパラメータ値のセットを定義していること、ExportToDiskが成功した実行、解決策を見つけます这个我猜测可能直接通过ReportDocument去导出时,默认还是用的pull方式,由于不熟悉水晶报表的使用,还忘大神指点!
遭遇ピット
首尾よくこのような剥離した後のように、上記の開発環境で正常にテスト、IISへの展開は、質問の束が登場しました!
- 次のようにlog4netの例外エラーが発生し読み込むことができません、と見て無知力、そしてどのようにlog4netのオンライン食事の研究については、コミュニティの公式回答樹液があり、基本的にはターゲットプラットフォームの選択コンパイル時の問題は、X86を選択すべきであると述べましたその後、試験食の狂ったが、無駄に、例外となっています。
Could not load file or assembly ‘log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304’ or one of its dependencies. The system cannot find the file specified
Mozheは、、何の生産環境を実行していないとき、すでにデフォルトでインストールされているSDKに基づいて、その開発環境が実現、ランタイムはCrystalReportsではないことを示唆し、異常を変え、ねえ、ディレクトリに32ビットのlog4netのを見つけましたまたはへhttps://www.crystalreports.com/crvs/confirm/ .NETフレームワークのためにSAP Crystal Reportsのランタイムエンジンをダウンロードするには、このサイトで 、 インストール
自信の再起動は、ちょっと、次のように奇跡は、私の神をヌルポインタ例外を発生し、新しい例外の出現はなかった、どのような地獄が実行されることが判明した
_rd.ExportToDisk
場合に例外が、nullにああではない_RD。System.NullReferenceException: 未将对象引用设置到对象的实例。 在 CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext) 在 CrystalDecisions.CrystalReports.Engine.FormatEngine.Export(ExportRequestContext reqContext) 在 CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToDisk(ExportFormatType formatType, String fileName)
彼の顔をオフにリッピングする力の際には、彼は実行時間とSDKの独自の影のバージョンを取るように見えました
SDKのバージョン:
CRforVS13SP25_0-10010309
ランタイムバージョン:
CR13SP26MSI64_0-10010309
1 SP26、難易度が一貫性のないバージョンが原因で引き起こされ、膝ジャークはSP25ですか?
SDKの新しいバージョンのダウンロードするには、公式サイトを、それを試してみてCRforVS13SP26_0-10010309
、インストールと展開を。
- この奇跡は、待望のレポートファイルを生成するために、最大実行smoothが!
概要
確認した目は、右の人を選択します!~~~~~~
ロジック自体は、バージョンに一致する展開プロセスの紆余曲折、実行は、心に留めなければならない、非常に簡単です!
最後に、ピットが掘ら自分自身、そしてまた彼のジャンプですが、自分自身の飛び出し、ビジョンは少し異なる場合があります!