随笔 - 45, 文章 - 0, 评论 - 488, 引用 - 12
数据加载中……

使用NHibernate时需要考虑的另一个问题

自从系统使用NHibernate后,开发一直比较顺利,直到开始做报表部分才发现有问题了:NHibernate如何与现有的报表组件集成?
昨天我写了一篇《关于crystal report和NHibernate应用的一个问题》,其中提到了Crystal Report 不能直接与NHibernate的 查询结果直接绑定的问题(刚刚试过了ActiveReport for .net也不行),从目前的情况来看,只有两种途径来解决:
1、封装报表控件,在其中编写Arraylist到DataTable的转换方法,从而实现数据的绑定;
2、在报表部分,不使用NHibernate,直接使用ADO.net。

第一种方法,肯定会影响到系统的效率,特别是需要使用Reflection来得到Entity的属性值。而第二种方法,则完全避开了NHibernate,不是我们的初衷(业务层面的一些工作又需要用ADO.net实现一遍)。

综合考虑,我们目前暂时采用第二种方式,不能哪位朋友有更好的建议?

这段时间比较关心NH的朋友越来越多了, 但很少有人将其运用到系统中,其在实用中可能会遇到各式各样的问题,希望这篇文章能够起到抛砖引玉的效果,使NH的应用不断的深入下去。

posted on 2005-05-14 21:19 wljcan 阅读(8260) 评论(43)  编辑 收藏 网摘

评论

#1楼    回复  引用  查看    

个人感觉 crystal report 不可能不支持IList
你有没有研究透
2005-05-14 22:46 | idior      

#2楼    回复  引用  查看    

--------
Datagrid的datasouce是所有实现System.Collections.IEnumerable 接口的object.,自然可以绑定IList接口。
你看看crystal report里的datasource。
---------

yoyo都已经给你指路了, 你自己要用都不研究. 就来问, 也太...

2005-05-14 22:50 | idior      

#3楼 [楼主]   回复  引用  查看    

to idior:

我不知道你为什么凭个人感觉来说话,我写blog之前我已经参考了一些资料,如果现在我下的结论有误,只能是我水平太低,入不了你的法眼。

DataGrid中对DataSource的描述:
----------------------------------------------------------------------
在运行时使用 SetDataBinding 方法来设置 DataSource 和 DataMember 属性。

下列数据源有效:

DataTable
DataView
DataSet
DataViewManager
任何实现 IListSource 接口的组件
任何实现 IList 接口的组件

-----------------------------------------

Crystal Report中对SetDataSource的描述:
-------------------------------
Passes a Recordset or Dataset to the report engine
----------------------------------
请注意:Recordset or Dataset !

ActiveReport中对DataSource的描述:
----------------------------------
The data source can be set to any of the ActiveReports built-in data sources or to any of the following:

DataSet
DataTable
DataView
Any RowCollection
-----------------------------------

我不知道这些文档能不能证明我所说的观点?

另外,我也写代码进行了测试,之后我才有这样的观点。需要我给你发一份代码吗?




2005-05-14 23:19 | wljcan      

#4楼    回复  引用  查看    

个人看法,NHibernate不是万能的。
在CRUD比较好用,省写很多语句。但是对于一些复杂的sql查询,还是用ADO.NET来的方便
2005-05-14 23:34 | Donaldxu      

#5楼    回复  引用  查看    

关键是在业务系统中,有很多查询语句已经用NHibernate实现了,绑定到DataGrid显示的,如果在报表系统中再用ADO.net重做,实在有点.....

唉,真有点不爽
2005-05-14 23:49 | wljcan      

#6楼    回复  引用  查看    

why not paste this in your post?
难道要留一手?

------
1、封装报表控件,在其中编写Arraylist到DataTable的转换方法,从而实现数据的绑定;
2、在报表部分,不使用NHibernate,直接使用ADO.net。
------

第一个不太现实,如果仅仅是显示数据是可以抛开nh(显示而已,不需要使用面向对象的特性),
所以推荐第二条

看来crystal report 是不考虑对象的, 我不了解crystal report 的本质.

2005-05-15 00:23 | idior      

#7楼    回复  引用  查看    

其实呢,查询是相当复杂,不要指望NH可以解决多少的查询问题。
我想对于一个稍复杂的系统,也许就一般的系统,NH就无法实现复杂查询的。用PL的目的是要在系统易扩展的基础上还要能高效开发,那NH所谓的查询,就怕会带来新一层面上的复杂。
NH用在系统中很少,使用那种关系功能的恐怕更少,那么多的关系中除了“一对多”的关系比较实用外,其他的根本没什么用。花那些精力,太冤。个人感觉。
2005-05-15 10:32 | 听棠.NET      

#8楼 [楼主]   回复  引用  查看    

to 听棠.NET :
我倒是觉得NHibernate中的HQL很丰富,至少我们系统中需要实现的查询功能,用它都能实现。

至于NHibernate中的关系,确实是one-to-many用的比较多一些,这可能与我们的数据库开发方式有一定的关系,比如在数据库中是存在many-to-many的,但是我们在开发习惯上仍然将它分解成one-to-many。
另外,我们也在某些特殊地方用到了many-to-one。(最简单的例子就是递归了)。 因此我的感觉是NHibernate从技术上来讲还是一个比较好的O/R Mapping工具,但是在实际运用中,可能达不到预期的效果。
2005-05-15 13:05 | wljcan      

#9楼    回复  引用  查看    

我知道HQL很丰富,就是因为功能强,所以HQL必然也会变的复杂,SQL已经让程序员们受不了,还要让他们去学HQL??这种HQL也不如SQL那样通用,这就是增加了复杂度。
至于关系,如果能利用好的话,应该是不错的。
2005-05-15 14:01 | 听棠.NET      

#10楼    回复  引用  查看    

其实HQL并没有想像的那么复杂,它与sql在很大程度上都类似。我们在开发的过程中,并没有直接去学习它,只有在使用的时候才可能会查一下资料,另外,由于有 NHibernate Query Analyzer工具的帮助,写HQL语句还是比较方便的。 仅仅从使用的容易度上来讲,使用NHibernate不会比Ado.net复杂多少。

有空的话,再研究一下你的SPL, :=)

2005-05-15 14:15 | wljcan      

#11楼    回复  引用  查看    

我建议直接用ADO.NET,但用NH和ADO.NET都有这样和那样的问题。

NH
1、其返回结果必须是一个entity class,在很多场合就不合适,性能就不用说了(有点时候只需要一列或二列)。
2、N+1的性能问题,虽然说不需要考虑性能,但是这个N+1的问题对性能的影响实在太大。若一个实体有三个子实体,并要返回10条记录,这样要发31条sql语句,谁受得了?

ADO.NET
1、若直接用ADO.NET,也就是用了广义的多层架构(可以跨层调用下层),那就跨过了很多业务层,可能AOP,或者权限就被跨过,导致权限等不能很好的控制,或者业务逻辑不能重用。
2、如果使用form +Model(即FormEntity + Entity)的方式,其数据格式转换的逻辑也要重新写了。
2005-05-15 22:36 | 浅水滩      

#12楼 [楼主]   回复  引用  查看    

比较同意 浅水滩 的说法。看来要建立一个比较理想的系统架构还是比较困难的,总会存在一些不如意的地方
2005-05-15 23:27 | wljcan      

#13楼    回复  引用  查看    

这就是OO和非OO数据库的矛盾,呵呵。
2005-05-16 08:33 | donaldxu      

#14楼    回复  引用  查看    

不知道有没有人用过java的hibernate,在J2EE的系统中,报表是如何实现的? 仍然通过JDBC的方式吗?
2005-05-16 08:57 | wljcan      

#15楼    回复  引用  查看    

我觉得是不是换一种方式考虑问题,既然水晶报表不支持IList 数据源不如换一种报表工具。
2005-05-16 09:45 | cmic      

#16楼    回复  引用  查看    

我得作法是修改了NH的代碼,執行hql的時候,直接返回DataReader或者DataSet,而不轉為IList,NH是先得到DataReader然後轉為IList的.這樣做對原本的代碼沒有任何影響
2005-05-16 13:17 | James      

#17楼    回复  引用  查看    

to cmic:
我已经尝试过ActiveReport和Crystal Report了,都不行,其它的还没有试过,不知你有什么好的提议?

to James:
你这样做的好处是可以重用定义的业务模型,但是带来了一些其它的问题:需要跟着NH升级。如果不是BUG的话,我一般不会直接修改开源项目的代码。 不过我觉得这个想法很好,可以向NH开发组建议一下,这样就方便多了。(仔细一起又觉得不伦不类,其实应该建议报表组件厂商修改DataSource的)


2005-05-16 14:00 | wljcan      

#18楼    回复  引用  查看    

report 不是o/r mapper的范畴了,所以别扭极了
2005-05-16 18:02 | kd      

#19楼 [楼主]   回复  引用  查看    

今天又试了一下,Devexpress 的XtraReport可以直接与IList绑定,这是V3版的说明:

XtraReportBase.DataSource Property:
Gets or sets the report's primary data source.

[Visual Basic]
Public Property DataSource As Object
[C#]
public object DataSource {get; set; };
Property Value
An object used as a data source. The default is null.

Remarks
Any object can be a data source for XtraReportBase objects if it supports the System.Collections.IList interface.

不过这个版本我没有源代码,而且对Web的支持也是刚刚加进去的,可能会有一些问题,目前也不打算用。

另外,xtraReport在C/S中很好用,我们一直用它。
2005-05-16 21:40 | wljcan      

#20楼    回复  引用  查看    

DevExpress的XtraReport我也使用过,是一个C/S的系统,在B/S下还没尝试过呢,这么多人对NHibernate感兴趣啊,支持!
2005-05-17 08:30 | 生如夏花      

#21楼    回复  引用  查看    

to:wljcan ,
我对J2EE比较熟悉。我们在做报表时,一样可以用hibernate来获取数据,它返回的是Collection对象,这是java里面通用的接口。我用jasper report做报表,使用Collection对象是没有如何问题的。我搞不懂.net里面为什么分开那么多的接口。:)
2005-06-13 13:23 | qinhui      

#22楼    回复  引用  查看    

业务相关的用NHibernate实现CURD,,
报表查询用SQL+ADO.NET,这样效率比较高。
2005-06-28 17:41 | MarlboroXP      

#23楼    回复  引用  查看    

顺便说一下,
Crystal Report给我的印象不好,以前做打印收据,自定义纸张。
报表文件在客户端发布时需要手动打开并重新保存一次才行。搞得我很郁闷。
2005-06-28 17:44 | MarlboroXP      

#24楼    回复  引用    

大家不要在一个工具的使用上讨论来讨论去!
在.NET中离开了ADO.NET,DataSet,那也就失去了.NET框架的高性能。其实DataSet本身就是一个基于xml的映射得来实体集。
在大型综合性系统得开发中,NHibernate优待验证,谨慎使用为好!
2006-01-10 12:15 | 天河 [未注册用户]

#25楼    回复  引用    

编写Arraylist到DataTable的转换方法

我用过,速度其实比想象的快
你试一试速度能不能忍受?
2006-03-20 00:15 | daqingshu [未注册用户]

#26楼    回复  引用  查看    

DataSet性能的确是不错,不过一想到开发前端页面的程序员也需要知道字段名时,
我的头就开始疼了。nhibernate的确还有待验证,但是他带来的高效的开发模式,更加
然我期待。
2006-04-03 17:21 | Michael      

#27楼    回复  引用    

绝对支持,我试过
2006-06-12 23:34 | jijl2001 [未注册用户]

#28楼    回复  引用    

类型化DataSet 就不用考虑字段的名字了

#29楼    回复  引用    

类型化DataSet 就不用考虑字段的名字了

#30楼    回复  引用    

试试修改代码,可以直接支持DataTable,甚至可以支持sql

#31楼    回复  引用    

I have been using nHibernate and VS2005 (C#). But, I have some trouble binding ObjectDatasource with Crystal Reports. Could you tell me which Report Engine are you using with nHibernate, and some tips and hints due this connections ?

#32楼    回复  引用    

http://www.super-troione.jobilimi86.info nuda brutta http://www.comico-asiatiche-gruppo.jobilimi86.info codardo amatoriali gruppo http://www.sesso-con-anziane.hobilimi86.info cameriera clip http://www.svedese-vergine.hobilimi86.info tope negre http://www.racconti-caldi-gratis.gobilimi86.info gnocche a pecorino http://www.culi-duri.gobilimi86.info piedi cugina racconti http://www.sexs-sciop.fobilimi86.info fighetta vogliosa http://www.free-rosse-arrapate.fobilimi86.info cameriera escort http://www.likable-lesbiche-dildo.robilimi86.info timoroso asiatiche succhi http://www.fighe-pelosa.robilimi86.info sexsi com
2007-05-17 19:15 | www [未注册用户]

#33楼    回复  引用    

.net 2.0 中的报表工具好像支持List<T> 了吧。我用来绑定基本没有什么问题
2007-05-18 18:35 | DavidLv [未注册用户]

#34楼    回复  引用    

<a href="http://www.nmnbc.info/ammucchiate-gratuite.html">ammucchiate gratuite</a> video di scopata gratis <a href="http://www.nmnbc.info/foto-gratis-fregna-italiana.html">foto gratis fregna italiana</a> diddl cartoline <a href="http://www.nmnbc.info/culi-profondi.html">culi profondi</a> ragazze piace cazzo racconti <a href="http://www.nmnbc.info/donne-con-culi-belli.html">donne con culi belli</a> storie sexi supereva <a href="http://www.nvhgf.info/fare-bocchini.html">fare bocchini</a> angelica bella pornostar movies <a href="http://www.nvhgf.info/film-italiani-con-trans.html">film italiani con trans</a> leccate di fighe <a href="http://www.nvhgf.info/sotto-le-mutande.html">sotto le mutande</a> tope gratis <a href="http://www.nvhgf.info/annunci-sex.html">annunci sex</a> fotomontaggio gratis personaggi famosi <a href="http://www.nvhgl.info/accompagnatrici-donne-trentino.html">accompagnatrici donne trentino</a> ancianas peludas <a href="http://www.nvhgl.info/siti-personali-tardone-con-voglia-di-cazzo.html">siti personali tardone con voglia di cazzo</a> foto professoresse <a href="http://www.nvhgl.info/amatoriale-video-torino.html">amatoriale video torino</a> private voyeur <a href="http://www.nvhgl.info/erotiche-porno.html">erotiche porno</a> scambio popunder <a href="http://www.nvjgh.info/mature-boobs.html">mature boobs</a> gay brasiliani <a href="http://www.nvjgh.info/fiche-cinesi.html">fiche cinesi</a> giochi anali <a href="http://www.nvjgh.info/figa-scopata.html">figa scopata</a> grosse tettone gratis <a href="http://www.nvjgh.info/donne-che-leccano-la-figa.html">donne che leccano la figa</a> come si fanno i pompini <a href="http://www.okfxx.info/shemale-superdotati.html">shemale superdotati</a> orge bestiali <a href="http://www.okfxx.info/insegnanti-porcone.html">insegnanti porcone</a> bionde puttane <a href="http://www.okfxx.info/belle-ragazze-svedesi.html">belle ragazze svedesi</a> topless foto amatoriali <a href="http://www.okfxx.info/superfiga-porno.html">superfiga porno</a> porno studentesse giapponesi gratis

发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: