2016-04-07 28 views
0

Crystal Reports XIをドットネットに使用すると、非常に奇妙な例外が発生します。私は現在、エンタープライズアプリケーション用のVB.Netでレポートサービスを開発しています。このサービスは、System.AddIn (aka Managed Add-in Framework or MAF)を使用してプラグイン/アドインとしてメインアプリケーションでホストされています。メインアプリケーションはWinフォームを使用し、WPFElementHostのアドインによって提供されるコントロールをホストします。Crystal Reportのレポートソースを設定すると、crdb_adoplus.dllにNullReferenceExceptionがスローされます

アドインは独自のアプリケーションドメイン内にあり、アドインアプリケーションドメインからNativeHandleContractsを使用してWPFコントロールを実行時にWPFElementHostにバインドされているホストアプリケーションドメインに渡します。

アドインで提供されるWPFコントロールには、Crystal Report Viewerコントロールが含まれています。これまでは、すべて正常に動作します。私はアドインでほぼすべてのWPFコントロールを作成することができ、ホストアプリケーションで完璧に動作します。ビューアにレポートを添付しようとするとすぐに、これは分断されます。

まず、ADO.Net DataSetをデータスキーマとして使用して、レポートを作成しようとしました。これがレポートビューアに読み込まれるたびに、クリスタルレポートはスキーマが存在しないという例外をスローします。これは何らかの理由でCrystal Reportsがホストアプリケーションのアプリケーションドメインとスキーマの名前空間を調べたいからです。ただし、スキーマは完全に異なるアプリドメインと名前空間に存在します。スキーマをリソースとして埋め込み、ローカルにコピーしようとしました。成功しなかった私は.Netオブジェクトを使用するようになりました。

.Netオブジェクトを使用して、レポート用に設計されたXMLドキュメントを作成しました。これは正常に動作し、レポートを渡してホストアプリケーションで表示することができました。これは私が現時点で詰まっているところです。 レポートのデータソースを提供しようとするたびに、Crystal Reportsはnullの参照例外をSAPのDLLであるcrdb_adoplus.dllにスローし、例外の原因を知らせません。すべてのオブジェクトが適切にインスタンス化され、レポート、ビューア、wpf要素ホスト、およびwpfコントロールが作成されます。エンティティフレームワークを使用して提供される私のデータセットは、データセットに変換されているので、null可能な型はなく、dbnull値のみです。この時点でこの例外がスローされる必要はありません。スローされる例外以外の追加出力は提供されません。

さらに、作成されたレポートオブジェクトには、この読み込みプロセス中にタイムアウトする部分があります。これは、あらゆる種類の例外やエラーがスローされることなく行われます。

データを取得し、データをレポートにバインドし、レポートをビューアにバインドしようとしているコードを次に示します。

 Try 
      Dim messages As String = Nothing 

      If report Is Nothing Then 
       report = New BOMPartsListWithStandard 
      End If 

      Using conn = BOMReportingService.BOMReportingServiceClient.CreateConnection() 
       Dim dataSet As DataSet = conn.Proxy.GetBOMTreePartsListElements(5339, messages).ToDataSet 
       report.SetDataSource(dataSet) 
      End Using 

      reportViewer.ViewerCore.ReportSource = report 
      reportViewer.ViewerCore.RefreshReport() 
      Debug.WriteLine($"Created and attached report succesfully. With {IIf(String.IsNullOrEmpty(messages), "no messages.", messages)}") 
     Catch ex As Exception 
      Debug.WriteLine(ex.ToString) 
     End Try 

report.SetDataSource(dataSet)ビットは、例外がスローされる場所です。

私は何かを見落としていますか?正しいアプリドメインでADO.Net DataSetを使用するようにCrystal Reportsに納得させる方法はありますか?そうすれば、XMLの問題を解決できますか?

このアドインは、実行時に動的にアンロードして再ロードできるように、別のアプリケーションドメインまたはプロセスに存在する必要があります。これはシステムの要件です。また、自己完結型である必要があるため、アプリケーションのホスト側では何もできません。すべてがアドイン内で動作する必要があります。

ご協力いただきありがとうございます。

+0

ToDataSetは、メモを追加したものと同様に、DataSetに変換してIListを設定する一般的なエクステンションです。これは問題なく動作し、Entity FrameworkのNullable型をDBNull.Valuesに変換する必要がありました。 –

答えて

1

私の周りの掘り起こしの後、私は自分自身の質問に答えました。他の人が同様の問題を抱えている場合に備えて、ここで答えを投稿します。

問題は、レポートがDataSetオブジェクトをどのように解釈するかにあるようです。何らかの理由で、データを探すときに失われます。したがって、実際の最初のテーブルエントリをポイントする必要があります。

だから私はこのコードのビットを変更:

 Using conn = BOMReportingService.BOMReportingServiceClient.CreateConnection() 
      Dim dataSet As DataSet = conn.Proxy.GetBOMTreePartsListElements(5339, messages).ToDataSet 
      report.SetDataSource(dataSet) 
     End Using 

私はreport.SetDatSource(dataSet.Tables(0))report.SetDataSource(dataSet)を置き換えます。だからこれは次のようになります

 Using conn = BOMReportingService.BOMReportingServiceClient.CreateConnection() 
      Dim dataSet As DataSet = conn.Proxy.GetBOMTreePartsListElements(5339, messages).ToDataSet 
      report.SetDataSource(dataSet.Tables(0)) 
     End Using 

これは将来的に誰かが外出するのを助けるでしょう。

関連する問題