yet

Dream Will Come True

 

2007年10月24日

利用SQL2005的forxml以及反系列化去替代ORM?

   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("&""&amp;");
                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数据库索引)。。还是看具体的结果去检验吧
其它就待补~~~没时间再写了。。呵呵

  

posted @ 2007-10-24 15:38 yet 阅读(1791) 评论(21) 编辑

怎样去获取文章简介

     相信大家在做博客,文章管理系统之类的时候经常会遇到这样的问题:
 
   把一些文章抽出来放在首页,当然这些文章要显示内容简介。但是问题来了,这些内容简介有时候有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 最后更新

posted @ 2007-10-24 13:40 yet 阅读(1825) 评论(24) 编辑

2007年10月23日

用自己的MVC框架

   说是框架或许有点夸张,不过还是勉强能用吧。
   最近发现园子里越来越多人讨论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

posted @ 2007-10-23 17:55 yet 阅读(2694) 评论(17) 编辑

2006年1月22日

(小技巧)怎样有选择的去屏蔽验证控件。

当我们一个表单内有2个Button的时候(Button1和Button2),我们经常会遇到这样的情况,比如:
用户名:(检测此用户是否存在)
密   码:(Text1不允许空)
                         (注册)
当我们点击Button2的时候总是提示(Text2不允许空)。而无法正常引发检测用户的button2的事件。这个时候我们可以这样做,在页面加载的时候把这个button2修改一下:
                  button2 .Attributes["OnClick"]="return true;";

do it!

posted @ 2006-01-22 01:06 yet 阅读(182) 评论(1) 编辑

2005年10月10日

高校软件杯作品:DreamChat[校园即时通]

客户端登陆窗口
  具体的代码构架请参见:http://www.cnblogs.com/ytml/archive/2005/08/21/219760.html

DreamChat软件简介

DreamChat(校园即时通) 看到这个名字就能会自然联想到现在流行的QQ软件,但是DreamChat并不是单纯的聊天工具,它主要是为了填补校园网络化管理的空白.(从学生到授课老师以及校园各部门职工)都可以在这个平台进行办公和交流甚至是远程网络教学!我们从中可以看到的是校园网络并不是只能用来聊天,上网,打游戏我们还可以做更多的东西.

现在来看看DreamChat的功能.

在这里你可以跟整个学校的任何一个人实时聊天,只要他在电脑面前.

在这里你可以轻松查到当前学期你的各科成绩

在这里你可以快速地向学校各部门反映情况,让学校领导更快的了解学生动向.

传送公文,照片不再需要U盘或者是打印机.

更快速地查看和获知当前学校的通知

 

你甚至在以后的版本里面可以: 参加网络教学,写请假条,部门内部办公,视频语音聊天,提交作业,布置作业,下载作业等等..

 

在开发技术上面RemotingP2P绝对是当前网络通信的主题..

 

Remoting,简而言之,我们可以将其看作是一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。Microsoft? .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。

 

基于微软最新的.net framework框架:对程序设计比较了解的人都知道,微软有过许多经典的开发语言,VC++VBJ++等,它们都一一对应一个开发框架,使用不同语言的开发人员使用不同的开发框架,而.net framework框架集成了以上所有的语言,使用不同语言的开发人员将可以在同一个框架上进行开发,这就意味着一种更高效,成本更低的开发模式的产生。这也是我们选择该框架的原因之一,另一个原因就是.net framework框架必将成为未来的流行趋势。

采用微软最新的C#语言开发:这种语言是.net framework框架上功能最强大的语言,他集VC++的高度灵活、JAVA的完全面向对象、VB快速开发为一体,有着高度的可扩展性。

 

   后台数据库采用SQL Server 2000SQL Server 2000也是微软的产品之一,我们选择SQL Server 2000的原因是它和C#语言之间的有着统一的底层接口,用C#语言访问SQL Server 2000要比访问其它数据库的效率高很多,并且SQL Server 2000数据库的吞吐量很大(可达每天100万条数据),完全胜任海量数据的存储与访问。

 

当然在这里我使用的是Access主要是为了便于演示.软件无需再编译便可直接轻松的使用你的SQL Server

  简单实用的服务器端(尽量避免服务器不必要的开销)

主要运行界面

等软件杯评比过后将会公开源代码相信对很多想学.NET网络编程和一些UI设计的朋友有用处的.

posted @ 2005-10-10 10:23 yet 阅读(1059) 评论(16) 编辑

2005年9月6日

梦凌NET期刊管理系统

在线后台演示:http://www.chinajiaju.com.cn/Admin_Login.aspx

在线前台演示:http://www.chinajiaju.com.cn/netmarketing.html

源码下载:暂时不能提供( : ) 过几天吧.... )

程序下载 : /Files/ytml/SellSystem.rar

简介: 是一个很简单很简单的程序..只是一个期刊的管理系统...关键是在源代码的组织方面有点小小技巧..功能方面没什么特殊.

posted @ 2005-09-06 13:33 yet 阅读(569) 评论(6) 编辑

2005年8月22日

一却都好像都在肢解着我

posted @ 2005-08-22 13:34 yet 阅读(152) 评论(0) 编辑

2005年8月21日

<远程教育系统>体系结构设计

posted @ 2005-08-21 21:24 yet 阅读(821) 评论(0) 编辑

2005年8月16日

协议分析[高校杯准备]

posted @ 2005-08-16 02:20 yet 阅读(310) 评论(1) 编辑

把.NET程序部署到没有安装.NET Framwork的机器上

posted @ 2005-08-16 02:02 yet 阅读(169) 评论(0) 编辑

导航

统计

公告

yet

昵称:yet
园龄:6年7个月
粉丝:0
关注:0

搜索

 
 

常用链接

随笔档案

test

最新评论

阅读排行榜

评论排行榜

推荐排行榜