2007年10月24日
ORM用多了就会发现越来越多的问题。。。。。最后就觉得ORM简直是鸡肋....(呵呵,别拿砖头砸我,个人觉得而已)
最后没办法了,发现SQL2005出来一个for xml 可以直接将查询生成xml返回,如果能把这个返回来的xml直接反系列化成实体,貌似很可爱,在测试了一段时间后决定把它用到项目中去。项目完成用到现在为止还没出现过严重问题,看来这个解决方案是可行的,不敢独享,贴出来大家一起讨论讨论。
一。在使用过程中,遇到过以下几个问题:
1、编写查询的存储过程是比较麻烦的(为此专门写了个windows小工具来辅助生成查询)
2、实体名不能随便改。。。。跟查询的存储过程有联系(这个就没办法了,反正实体名我不改就是了)
3、xml非法字符问题。(替换。。。)
4、xml中带有html字符的时候(cdata,然而怎么在数据库查询的是偶构建cdata字段的问题)
5、好像没再遇到什么问题了,至于有人说大量查询的时候会出现xml断层的问题也是比较容易解决的
二。至于效率问题的话,现在这个项目网站运行差不多一个月来有12000用户注册,不见有任何服务器CPU过高或者死机的情况(当然这跟数据库存储过程优化以及数据库索引有很大关系),算是比较满意。
三。详细解决方案
1、数据库方面
当然不能再用SELECT * FROM 什么的方法了。下面是一个简单的查询
a、返回数据集
SELECT
1 as Tag,
0 as Parent,
UserId as [Users!1!UserId!ELEMENT],--用户ID
UserEmail as [Users!1!UserEmail!cdata] --用户Email
FROM
[User]
FOR XML EXPLICIT,ROOT('ArrayOfUser')
b、返回单条数据
SELECT
1 as Tag,
0 as Parent,
UserId as [Users!1!UserId!ELEMENT],--用户ID
UserEmail as [Users!1!UserEmail!cdata] --用户Email (注意,这里使用cdata就可以把生成的xml文件UserEmail包含在cdata中)
FROM
[User] WHERE UserId = 1
FOR XML EXPLICIT
2、程序方面
呵,不像一些ORM框架一样要引入项目,生成配置文件这么痛苦~~换来的是要自己写sqlcommand,open sqlconnection等等,但是我个人认为这些东西自己写的话也有很多方法可以偷懒,呵呵在这里就不介绍这些东西了,反正创建一个SQLCOMMAND,给SQLCOMMAND提供相应的参数,然后SQLCOMMAND.ExecuteDataReader就好了。。。
a、当然你的有个User的实体,大概如下:
public class User
{
int userId = 0;
public int UserId
{
get{}
set{}
}
//略
}
b、然后你必须将上面的存储过程执行,并返回datareader
c、反序列化
private static Regex reg = new Regex("[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]", RegexOptions.Compiled| RegexOptions .IgnoreCase | RegexOptions.Multiline);

/**//// <summary>
/// 反序列化对象
/// </summary>
/// <param name="xmlstr">源xml字符串</param>
/// <param name="objtype">要序列化后的类型</param>
/// <returns>结果</returns>
static public object Deserialize(string xmlstr, Type objtype)

{
if (string.IsNullOrEmpty(xmlstr))
return null;
object obj = null;
xmlstr = reg.Replace(xmlstr, "");
XmlSerializer serializer = new XmlSerializer(objtype);
try

{
obj = serializer.Deserialize(new StringReader(xmlstr));
}

catch
{
xmlstr = xmlstr.Replace("&", "&");
obj = serializer.Deserialize(new StringReader(xmlstr));
}
return obj;
}

/**//// <summary>
/// 反序列化对象
/// </summary>
/// <param name="reader">从reader进行反序列化,序列化完毕后将在这里关闭</param>
/// <param name="objtype">要序列化后的类型</param>
/// <returns>结果</returns>
static public object Deserialize(System.Data.IDataReader reader, Type objtype)

{
return Deserialize(reader, objtype, true);
}

/**//// <summary>
/// 反序列化对象
/// </summary>
/// <param name="reader">从reader进行反序列化,序列化完毕后将在这里关闭</param>
/// <param name="objtype">要序列化后的类型</param>
/// <param name="isCloseReader">是否关闭IDataReader</param>
/// <returns>结果</returns>
static public object Deserialize(System.Data.IDataReader reader, Type objtype,bool isCloseReader)

{
StringBuilder sb = new StringBuilder();
while (reader.Read())
sb.Append(reader[0].ToString());
if(isCloseReader)
reader.Close();
try

{
return Deserialize(sb.ToString(), objtype);
}
catch (Exception ex)

{
throw;
}
}
d、将你执行后的datareader直接调用上面的方法
User user =
Deserialize(reader,typeof(User));
或者
User[] user =
Deserialize(reader,typeof(User[]));
======================================end===========================================
就是这么简单。。。。至于说那些什么反射啊之类的影响性能啊(个人觉得在.NET里面的性能就算再优化,还不如花多点时间去优化SQL查询语句以及SQL数据库索引)。。还是看具体的结果去检验吧
其它就待补~~~没时间再写了。。呵呵
相信大家在做博客,文章管理系统之类的时候经常会遇到这样的问题:
把一些文章抽出来放在首页,当然这些文章要显示内容简介。但是问题来了,这些内容简介有时候有HTML,有时候没有,如果单纯的去截断字符似乎有点笨拙,特别是在DIV页面上,很容易就截断了HTML,导致页面变形了。
解决办法有很多,有些人是用div的样式去隐藏来解决,但是还是不完整,导致页面变形,或者直接显示出整篇文章来。
下面的代码就可以解决这个问题,(:) 代码很简单,只是介乎你有没有认真去想而已了,在这里就不对代码做相信说明了。)
使用方法:直接调用 StripLongContent("你的内容",你要显示在页面上的长度);
static Regex Content_regex = new Regex("<[^<>]+>?", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);
public static string StripLongContent(string content, int length)

{
//去掉JS
//content = StripScriptTags(content);
string input = "";
//如果总长度都不够指定的长度,直接返回
if (content.Length <= length)
return content;
//匹配出<>中的标签
Match mx = Content_regex.Match(content, 0, content.Length);
Stack tagStack = new Stack();
int startIndex = 0;
string temp = "";
int maxlength = 0;
//其实很简单,保证截取出来的段落有结束的html标签就可以了,但是也不能出现类似
//<tr><td></tr>
//的HTML问题
while (mx.Value != string.Empty)

{
temp = content.Substring(startIndex, mx.Index);
//当然也要保证非显示字符数不要包括到要显示的字符数中。否则会严重影响简介的质量
//或者你要这里确定一个br算多少个字符都可以
if (maxlength + temp.Length >= length)

{
temp = temp.Substring(0, length - maxlength);
input = input + temp + "
";
maxlength = length;
break;
}
maxlength += temp.Length;
input = input + temp + mx.Value;

//分别对HTML标签进行压栈出栈操作
if (mx.Value.EndsWith("/>"))

{
}
else if (mx.Value.StartsWith("</"))
tagStack.Pop();
else
tagStack.Push(mx.Value);



int index = content.IndexOf(mx.Value);
content = content.Remove(0, index);
content = content.Remove(0, mx.Length);

mx = Content_regex.Match(content, 0, content.Length);
}
//如果整篇文章没有HTML标签,直接切就可以了
if (maxlength == 0)

{
if (content.Length < length)
content = input + content;
else
content = input + content.Substring(0, length) + "
";
return content;
}
//按顺序补全未结束的HTML标签
while (tagStack.Count > 0)

{
string tag = tagStack.Pop().ToString();
if (tag.IndexOf(' ') > 0)
tag = tag.Substring(0, tag.IndexOf(' ')).Replace("<", "");
else
tag = tag.Replace("<", "").Replace(">", "");
input = input + "</" + tag + ">";
}
return input;
}
2007-10-25 最后更新
2007年10月23日
说是框架或许有点夸张,不过还是勉强能用吧。
最近发现园子里越来越多人讨论MVC框架了,看来webform终于受到唾弃了。
确实.NET的webform笨重又很难美观。特别是现在中国的网站需求越来越高,再加上AJAX的冲击,如果还是沉浸在.NET FORM控件+UPDATE PANEL来开发web项目,几乎很难拿出让客户,boss接受的东西出来了。
这里是我一直在用的MVC框架,其实MVC框架一大堆,真的能找到一款自己合适用的却很难,很多MVC框架过于庞大,搞得到最后跟WEBFORM没什么区别,自己要加点东西进去很别扭。然后让项目里面的人去学习,成本也很大。特别是很多一直喜欢webform的人,根本无法接受这么复杂的东西。
我个人觉得,真正的MVC框架应该能让程序员彻底的从页面完完全全分离出来,而不是像.NET WEB FORM那样说是分离,其实到最后藕断丝连!如果再让框架紧密结合Javascript框架那就几乎完美了,让web程序员轻松的完成页面跟客户的交互,又可以让C#程序员无视页面的复杂,专心的提供数据,响应数据就是了。
闲话少说,我的这个MVC框架代码很简单,加入到项目中也很容易,在这里我就不写详尽帮助文档了,真的有朋友用到了遇到问题再说吧,附件里面带有框架源代码以及一个测试项目。
整个框架是跟jQuery紧密结合的,涉及到分页等等。
最后是应用在这个框架上的一个成熟项目,
http://www.cnmp3.com
(整个项目是我随便打包的,如果有错或者有漏的话还请大家原谅)
下载:
MVCFrameworkCN.rar
2006年1月22日
2005年10月10日

客户端登陆窗口
具体的代码构架请参见:http://www.cnblogs.com/ytml/archive/2005/08/21/219760.html
DreamChat软件简介
DreamChat(校园即时通) 看到这个名字就能会自然联想到现在流行的QQ软件,但是DreamChat并不是单纯的聊天工具,它主要是为了填补校园网络化管理的空白.(从学生到授课老师以及校园各部门职工)都可以在这个平台进行办公和交流甚至是远程网络教学!我们从中可以看到的是校园网络并不是只能用来聊天,上网,打游戏我们还可以做更多的东西.
现在来看看DreamChat的功能.
在这里你可以跟整个学校的任何一个人实时聊天,只要他在电脑面前.
在这里你可以轻松查到当前学期你的各科成绩
在这里你可以快速地向学校各部门反映情况,让学校领导更快的了解学生动向.
传送公文,照片不再需要U盘或者是打印机.
更快速地查看和获知当前学校的通知
你甚至在以后的版本里面可以: 参加网络教学,写请假条,部门内部办公,视频语音聊天,提交作业,布置作业,下载作业等等..
在开发技术上面Remoting和P2P绝对是当前网络通信的主题..
Remoting,简而言之,我们可以将其看作是一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。Microsoft? .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。
基于微软最新的.net framework框架:对程序设计比较了解的人都知道,微软有过许多经典的开发语言,VC++,VB,J++等,它们都一一对应一个开发框架,使用不同语言的开发人员使用不同的开发框架,而.net framework框架集成了以上所有的语言,使用不同语言的开发人员将可以在同一个框架上进行开发,这就意味着一种更高效,成本更低的开发模式的产生。这也是我们选择该框架的原因之一,另一个原因就是.net framework框架必将成为未来的流行趋势。
采用微软最新的C#语言开发:这种语言是.net framework框架上功能最强大的语言,他集VC++的高度灵活、JAVA的完全面向对象、VB快速开发为一体,有着高度的可扩展性。
后台数据库采用SQL Server 2000:SQL Server 2000也是微软的产品之一,我们选择SQL Server 2000的原因是它和C#语言之间的有着统一的底层接口,用C#语言访问SQL Server 2000要比访问其它数据库的效率高很多,并且SQL Server 2000数据库的吞吐量很大(可达每天100万条数据),完全胜任海量数据的存储与访问。
当然在这里我使用的是Access主要是为了便于演示.软件无需再编译便可直接轻松的使用你的SQL Server

简单实用的服务器端(尽量避免服务器不必要的开销)
主要运行界面
等软件杯评比过后将会公开源代码相信对很多想学.NET网络编程和一些UI设计的朋友有用处的.
2005年9月6日
在线后台演示:http://www.chinajiaju.com.cn/Admin_Login.aspx
在线前台演示:http://www.chinajiaju.com.cn/netmarketing.html
源码下载:暂时不能提供( : ) 过几天吧.... )
程序下载 :
/Files/ytml/SellSystem.rar简介: 是一个很简单很简单的程序..只是一个期刊的管理系统...关键是在源代码的组织方面有点小小技巧..功能方面没什么特殊.
2005年8月22日
2005年8月21日
2005年8月16日