大家晚上好。
我正在使用MVVM,Fluent NHibernate,C#.Net上的WPF开发应用程序,我们需要生成一些窗口的报告。我需要使用Crystal Reports工具创建报告。 AFAIK,Crystal Reports仅使用DataSet生成报告。在siimple应用程序中,我只能生成一个DataSet,构建报告并使其运行。但是我如何才能使NHibernate理解,或者如何使它工作,用NHibernate传递数据,而不是创建一个DataSet并让这个报告直接访问数据库?简而言之:我想使用NHibernate获取的所有数据来填充报告。
欢迎任何帮助!!!
最诚挚的问候,
古斯塔沃
答案 0 :(得分: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()方法,它基本上允许你在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创建新会话)。您还可以传入“裸”SQL字符串来执行;我通常会避免这种情况(事实上,实际实现中的存储过程的名称是在特定静态类型的常量实例后面抽象的,类似于枚举)。