1

皆さん、こんばんわ。

C#.NetでMVVM、Fluent NHibernate、WPFを使用してアプリケーションを開発していますが、いくつかのウィンドウのレポートを生成する必要があります。CrystalReportsツールを使用してレポートを作成する必要があります。AFAIK、Crystal Reportsは、DataSetを使用したレポートのみを生成します。単純なアプリケーションでは、DataSetを生成し、レポートを作成して実行することしかできませんでした。しかし、DataSetを作成してこのレポートを作成してデータベースに直接アクセスする代わりに、NHibernateを理解させる方法、またはNHibernateでデータを渡す方法を教えてください。簡単に言うと、NHibernateで取得したすべてのデータを使用してレポートにデータを入力したいと思います。

どんな助けでも大歓迎です!!!

よろしくお願いします、

グスタボ

4

1 に答える 1

2

http://ayende.com/blog/2376/converting-an-object-collection-to-a-dataset

http://abombss.com/blog/2007/05/09/nhibernate-to-dataset/

あなたの問題は新しい問題ではありません。基本的に、通常の解決策は、ドメインオブジェクトのコレクションとしてNHibernateから情報を取得し、それらのオブジェクトのプロパティを使用して手動でDataTableを構築することです。

小さなバニラADOをNHibernateにボルトで固定することもできます。NHibernate ITransactionsにはEnlist()メソッドがあり、基本的に、プレーンなol AD​​ODbCommandをNHibernateの実装の内部にあるADODbTransactionに関連付け、NHibernateを使用していない場合と同じように実行して結果を取得できます。 ADO.NET形式。これが私がリポジトリの実装に入れたもので、名前でレガシーストアドプロシージャを呼び出すことができます。

    public IDataReader ExecuteReaderStoredProcedure(string procName, IUnitOfWork uow, IEnumerable<KeyValuePair<string, object>> parameters)
    {
        var command = Sessions[uow].Connection.CreateCommand();

        command.CommandText = procName;
        command.CommandType = CommandType.StoredProcedure;
        foreach (var param in parameters)
        {
            var parameter = command.CreateParameter();
            parameter.ParameterName = param.Key;
            parameter.Value = param.Value;
            command.Parameters.Add(parameter);
        }

        Sessions[uow].Transaction.Enlist(command);
        return command.ExecuteReader();
    }

その後、DataReaderを使用してDataTable/DataSetにデータを入力できます。

いくつかのメモ; 表示されるIUnitOfWorkオブジェクトは、セッションとそのトランザクションにリンクするトークンであり、それらのスコープと存続期間を制御するために使用されます。これを変更して、使用しているセッション処理メカニズムを使用できます(必要に応じて、このコマンド専用にSessionFactoryから新しいセッションを作成することも含まれます)。「裸の」SQL文字列を渡して実行することもできます。私は通常これを避けます(実際、実際の実装でストアドプロシージャの名前は、列挙型と同様に、特定の静的タイプの定数インスタンスの背後に抽象化されています)。

于 2012-11-20T23:37:51.810 に答える