1

各位晚上好。

我正在 C#.Net 上使用 MVVM、Fluent NHibernate、WPF 开发应用程序,我们需要生成一些窗口的报告。我需要使用 Crystal Reports 工具创建报表。AFAIK,Crystal Reports 只生成带有数据集的报告。在简单的应用程序中,我只能生成一个数据集,构建报告并使其运行。但是我怎么做才能使 NHibernate 理解,或者如何使它工作,使用 NHibernate 传递数据,而不是创建一个 DataSet 并使这个报告直接访问数据库?简而言之:我想使用通过 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。

您还可以在 NHibernate 上添加一点香草 ADO。NHibernate ITransactions 有一个 Enlist() 方法,它基本上允许您在 NHibernate 实现的内部将一个普通的 ADO DbCommand 关联到 ADO DbTransaction 方法,并像不使用 NHibernate 时一样执行它,以获得结果ADO.NET 格式。这是我放入 Repository 实现的内容,允许我按名称调用遗留存储过程:

    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 对象是链接到 Session 及其 Transaction 的令牌,用于控制它们的范围和生命周期;您可以修改它以使用您拥有的任何会话处理机制(包括从 SessionFactory 仅为此命令创建一个新的 Session,如果您选择)。你也可以传入“裸”的 SQL 字符串来执行;我通常会避免这种情况(事实上,实际实现中存储过程的名称是在特定静态类型的常量实例后面抽象出来的,类似于枚举)。

于 2012-11-20T23:37:51.810 回答