77家的会客2010

N3C开发记事本
Weather:阴天,在家窝一天

先解释下什么是N3C,是我为我的网站新版定的代码,这个代号从最初的NEW3RGB变成后来的N3,再后来就演变成了N3C,怎么理解呢?从第一个名字理解也可以,也可以理解成.net版或是用了nhibernate的3rgb新版了,所以new new nhibernate三个n,随便选。而为啥叫3C呢?3可以理解成我柠檬网站重要版本的第3版,也可以和后面的C一起理解为3 color,也就是RGB了。

好了,名字就不废话太多了,新版的开发从年初说到年尾才开始,其实也就到今天(2008/11/22)也就写了不到两周,但是从今天开始记录一些开发中的东西,而这篇日志一直处于隐藏状态,直到你看到这一版程序发布的时候了。

N3C采用.net2.0,NHibernate2,SQLite3为基础,开发工具VS2008,采用log4net记录日志,至于分层不分层已经由NHibernate决定了,能不分吗?

前台最重要的还是和前一版本一样,采用jQuery,大多的前台数据ajax操作及一些动态效果,都是用他的功劳了。

另外,正在研究MetaWeblogAPI,希望能在源代码公开的时候能做成功。好了,下面开始记录了

[2008/11/22]

  •  从SQLite中用NHibernate取出有时间字段的表数据时,发生“该字符串未被识别为有效的 DateTime”错误,而此时在你确认你的NH对象类的属性设置和NH映射文件都是正确的情况下,请检查数据库中对应类型为datetime的字段的值,像我的是因为之前测试NH对象类的基本操作时,产生的时间格式成了‘1899/12/31 0:00’这样,将这样的记录删掉或是更新成别的不好了。
  • 用Criteria查询时,想在SQL语句中用SQL函数怎么办呢?不能直接用Expression.Eq("fun(name)","value")这样的,因为Expression.Eq()的第一个参数必须是你要查询的类的属性名(不是字段名哦)。我们可以用Expression.Sql(string.Format("fun(name)={0}","value")),如果你的函数结果是字符串的话,记得在{0}两边加单引号,比如在N3C里查询某一个月的日志时,我可以采用Expression.Sql(string.Format("strftime('%Y%m',AddTime)='{0}'","200811")
  • 不管你用的是ICriteria还是IQuery查询,在最后用.list()或.list()取出结果集,不管数据库里有没有数据,返回的结果都不是null,所以不能用null==resultList来判断,要用resultList.Count>0来判断是否有值。
  •  日志第一页,由于访问频率比较高,服务器端缓存,日志总数(无分类)采用公共application记录
  • 在前台可用<%# Eval("name")%>来取datasource里的值,.net2.0以前只支持<%# DataBinder.Eval(Container.DataItem,"name")%>或<%# DataBinder.Eval(Container.DataItem)["name"]%>。
  • 在前台进根据EVAL值进行逻辑判断要显示什么的话,可以用" runat="server">.....
  • 如果用用的是.net2.0,SQLite3,NHIbernate2的话,不要相信网上那么教程,那些都是NH1以及SQLITE3以前的,非常不好用,会搞得你头大到曝。在NH的设置里要用SQLite20Driver,这个是FOR .net2.0的,而SQLite的操作组件也不要用SQLite.NET.dll,去找System.Data.SQLite.dll这个组件,这一个组件就顶SQLite.NET.dll和sqlite3.dll,SQLite.dll(后两个是和SQLite.dll配套使用的,网上现在的大多SQLITE+NHIBERNATE的教程,都是让用这个的,放弃吧。。。)

[2008/11/24]

  • Nhibernate的一对多关系,适用于(1),添加新的子对象数据时(用处不是太明显);(2),用于一下取出某一父对象的所有子对象时(不可设置条件,除非在映射文件中设置过滤条件)。而我们一般用的是第二种,但是,于我们实际开发而言,又极少会无条件的取出所有的子对象,比如我们要对子对象分页取出或是据权限取出不同的数据这样,就不能用这种一对多关系实现了。(怎么感觉这个一对象多关系对我现在的N3C来说有点鸡肋了呢。。。。)
  • 写了两周的C#了,今天回头看了一些vb.net的代码,感觉太恶心了,连个类 属性成员GET,SET都那么麻烦,真不知道之前三个月的vb.net我是怎么写过来的。不过vb.net也有自身的好处,就是在写代码时不用管大小写,VS会自动帮你更正,你所要的就是习惯vb.net的代码书写风格然后低头写就是了。(发个小牢骚,不应计在这记录里的吧?)
  • 博客的上一篇下一篇功能挺恶心人的。如果用SQL SERVER等还好说,写个存储过程就行,但SQLite不支持STORED PROC,之前给小T写的那个用的是ACCESS是用两条SQL语句实现的。而我现在用NH实现数据,本来数据操作都封装在了DAO层,这样就得为这个功能在抽象DAO类里加一个方法了。

[2008/12/03]

  • 好几天没写了,但代码还是在继续写的。。。
  • 在日志搜索列表部分,我不想显示日志主体(内容太大,从库里检出来还没用),就写了个视图,由于实体对象和原来的日志差不多,就是少了一个Content字段属性,于是我就偷懒用simpleEntry直接继续了Entry这个类,然后映射了一下HBM。结果怎么也不对,总是相同的结果搜索出两次,在进行总数统计时UniqueResult的时候,就会出错“query did not return a unique result: 2”。原因就是因为这两个实体类是继承关系,而NH在检索的时候,是将两个类对象都检索的,这就造成了Unique冲突,还是老实写simpleEntry类吧,不要从Entry继承了。
  • 用NH的反向生成表功能也不错,特别是在写好了实体类而库还没决定用什么库的时候,连上数据库反向生成一下就OK了。只不过在HBM里设置的字段属性,在数据库里不一定完全一致,特别是类似索引主键这样的东西,手动修改一下吧。
  • 发现,宁可用NH的复杂的多对多关系以及继承关系。不如直接在数据库上写存储过程及视图和触发器,只是SQLITE只支持后两者,不过已经够了。对于统计之类的更新或消除,触发器是个很好的东西。

[2008/12/06]

  • 进度75%了。
  • 后台日志相关的管理部分差不多快完成了,只剩下把FCK和CKFINDER集成上去,但还是考虑上传是用CKFINDER呢,还是用FLASHUPLOAD。然后再增加个用户管理就可以了。
  • 留言版的管理放在前台进行,部分日志的管理功能也可以在前台扩展,这就需要前台加一个AJAX登录,只实现登录状态,而不进入后台。
  • 页面进行数据绑定的时候,实现条件判断显示,(Eval("item").Equals(value)?Eval("itemt","some{0}text"):"othertext")来进行,但value的类型必须与Eval("item")一致。
  • 前台尚未完成的:博客的AJAX提交留言,日历,留言板的留言框及功能。留言和日志留言的博主回复功能。RSS订阅功能。页面的CSS啊,要最后一步了。
历史上的今天: [2007/11/23]javascript小数运算,截取小数位数
[2006/11/23]日语流行口语[分享]
[2005/11/23]就是一个累呀

[N3C开发记事本]的回复

Post a Comment~