Juvy

I Believe Persistence.

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  22 Posts :: 0 Stories :: 118 Comments :: 0 Trackbacks

公告

2012年2月21日 #

        这篇文章的出现源于跟同事的一次争吵,其中争吵的主题是关于软件中一些控件的显示风格的问题,主要包含下面这些情况:

        1、Lable控件的对齐方式,是否在Label控件的Text最后加上冒号,也就是“:”;

        2、ListLiew控件列头文字对齐方式、是否显示网格线;

        3、……

        一个项目多个人开发,自然会出现多种不同的风格,但是萝卜白菜,各有所爱,最后做出来的软件是样式万千啊,这样做出来的东西让人用了如何爽的起来啊,用户还不得开口骂人啊?

        但是一个软件下来,控件都有几百个,如何一个一个的去改风格啊,到时候软件是改好了,用户不骂人了,估计程序员开骂了,nnd,这是个什么事儿啊?

        有时候感觉懒人在这个世界上还真有他的一片天空,如果能够一个方法来解决所有的这些问题该有多好啊,想着想着,眼前一亮,还真有,如果在每个UserControl,或者Form的PreRender方法中进行一次多所有控件的递归遍历,然后对相关的控件做相应的处理,大概代码如下:

1 foreach(UserControl ctrl in this.Controls)
2 {
3     if(ctrl is Label).....
4     if(ctrl is ListView).....
5 }

        这样似乎从一定程度上简化了程序员修改代码的难度,从一个个的去修改控件的属性,变为通过代码循环处理来修改控件的属性,但是随之而来又会面临一个问题:本身递归就是一个很影响性能的操作,但是如果有控件嵌套使用的话,会出现对同一个控件进行多次控件遍历的情况,这样的话对性能的影响就更大了。

        有没有办法可以躲开重复遍历的问题吗?答案是:有的!

        如果我们写一个UserControl和一个Form的基类,然后只在这两个基类中编写控件遍历处理的操作,然后让所有的UserControl和Form都继承这两个基类,这样完全可以解决前面的难题,同事代码量也会减少很多。

 

总结:到这里,我想文章的意思应该与题目“项目开发之底层对象抽离”相呼应了,那就是:为了便于对自己写的所有代码做一个统一处理,最好的方法就是尽量将同一类对象抽象出来写一个基类,然后在基类中来做统一处理即可。想想我们平时都会有哪些对象是可以抽离出来的呢,我这里举几个例子,或许还有很多,留待慢慢发现:
        1、所有UserControl基类
        2、所有Form基类
        3、实体类基类;
        4、实体类字段基类;
        5、所有功能组件;

 

ASP.NET开发技术交流群: 67511751

另:本人想找一些志同道合的人,可以是跟我一起交流技术的,或者是给予鼓励和支持的,非诚勿扰,谢谢!

QQ:1054930154

 

 

posted @ 2012-02-21 20:43 Juvy 阅读(1546) 评论(11) 编辑

2011年12月28日 #

       说到日志,大家都清楚,无非就是记录:谁,在什么时候,做了什么/发生了什么错误,是不是觉得很简单。这次我也来做一回轮子,一步步教你如何写自己的日志帮助类。

       在开始之前我们需要分析一下日志帮助类(这里主要指文本日志)有哪些地方需要注意的:

1)、日志帮助类是用静态类,还是用?

2)、日志发生者通过什么方式传入,参数,还是?

3)、日志通过什么方式写,同步还是异步?

4)、日志文件保存位置和文件大小控制。

5)、扩展问题。

 

暂时个人只找到这么多,望大家补充。

        下面我就来说自己在这些方面是如何处理的

一、日志帮助类是用静态类,还是用?

       我的选择是非静态类,即通过实例化的方式获取日志帮助类对象,然后调用方法写日志,具体代码为:

TextLogHelper LogHelper = new TextLogHelper();

LogHelper.WriteLog(......);

       为何要这样做呢?其实说起来,自己当初写的好多东西都是静态,如静态类,静态对象、静态方法等等,因为那玩意儿好使啊,写起来方便,调用更加方便,为何不用。但是在不断的码农生活中,自己慢慢觉得有时候静态的东西也并不好使,例如:

       1)、静态公共字段/属性:并发问题,因为调用方都可能会修改值。这里只是说可能存在这种情况;

       2)、公共方法:参数个数问题。因为是静态方法,所以方法内部所需要的信息,只能通过参数的形势传入;

       3)、静态字段、属性维护问题,因为静态的字段太多,太杂,维护起来自然增加了难度。

       4)、面向对象程序开发的一个核心就是多态,所以如果用静态类的话,就不可能实现多态了。

       至于其他的这里就不一一列举了。还有一点需要指出的是,上述几点只是想说静态类存在这些问题,但并非表示任何情况都不适合用静态类,如工具类,数据转换类等,就可以采用静态类方法实现。所以采用静态类与否,还得根据实际情况而定。

 

二、日志发生者通过什么方式传入,参数,还是?

三、日志通过什么方式写,同步还是异步? 

四、日志文件保存位置和文件大小控制。

五、扩展问题。

        二、三、四、五几点我就放在一块来讲述了。

        其实日志发生者存在两种情况:一种是固定的日志发生在,如系统日志,或者框架内部日志;另外一种就是用户日志,如Web应用程序中,不同的用户登录就会面临不同的日志发生发生着。

        先来给出SAS框架中的文本日志类的两个构造函数:

private TextLogHelper(string logSavePath, bool asynMechanismLog, int logFileSize){...}

public TextLogHelper(Func<ILogUser> getLogUserHandler, string logSavePath, bool asynMechanismLog, int logFileSize){...}

public TextLogHelper(ILogUser logUser, string logSavePath, string asynMechanismLog, string logFileSize){...}

       通过上面几个构造函数,你或许已经看出了上面端倪了:

       1)、日志文件保存路径、同步/异步方式保存日志内容、日志文件大小问题的控制,都是通过构造函数参数传入的.

       2)、日志用户采用ILogUser的方式,也是为了便于扩展。在扩展方面其实还有一个ILogHelper接口,而本文要将的TextLogHelper就是继承自ILogHelper接口。

       3)、日志发生着通过两种方式传入,第一种是委托方式,让调用方来决定日志发生者是谁;第二种是直接传递日志用户对象进去。

      下面给出ILogHelper接口的代码。

 

 1 namespace SAS.Interface
 2 {
 3     #region using
 4     using System;
 5     #endregion
 6     /// <summary>
 7     /// NameSpace :: SAS.Interface
 8     /// Creater :: Juvy[david.telvent@gmail.com]
 9     /// Create Time :: 2011-11-13 7:50:47
10     /// Function :: 日志帮助类基类
11     /// </summary>
12     public interface ILogHelper
13     {
14         /// <summary>
15         /// 当前日志帮助类所使用的日志用户
16         /// </summary>
17         Func<ILogUser> GetLogUserHandler { getset; }
18         /// <summary>
19         /// 写日志信息
20         /// </summary>
21         /// <param name="message">日志信息</param>
22         void WriteLog(string message);
23         /// <summary>
24         /// 写日志信息
25         /// </summary>
26         /// <param name="message">日志信息</param>
27         /// <param name="methodName">当前出错的方法名称</param>
28         void WriteLog(string message, string methodName);
29         /// <summary>
30         /// 写日志信息
31         /// </summary>
32         /// <param name="ex">异常</param>
33         void WriteLog(Exception ex);
34         /// <summary>
35         /// 写日志信息
36         /// </summary>
37         /// <param name="ex">异常</param>
38         /// <param name="message">日志信息</param>
39         void WriteLog(Exception ex, string message);
40         /// <summary>
41         /// 写日志信息
42         /// </summary>
43         /// <param name="ex">异常</param>
44         /// <param name="message">日志信息</param>
45         /// <param name="methodName">当前出错的方法名称</param>
46         void WriteLog(Exception ex, string message, string methodName);
47     }
48 }

       日志接口包含五个写日志的方法,一个获取日志用户的属性。实现起来应该很简单,所以至于如何实现,在这里就不多讲了,留待自我发挥。

       现在说说本日志帮助类的两点不足:

       1)、日志级别问题

       2)、日志类型问题

 

       好了,本片SAS框架之文本日志类就讲到这里了,欢迎大家斧正!

 

 

ASP.NET开发技术交流群: 67511751

另:本人想找一些志同道合的人,可以是跟我一起交流技术的,或者是给予鼓励和支持的,非诚勿扰,谢谢!

QQ:1054930154

posted @ 2011-12-28 10:42 Juvy 阅读(1319) 评论(6) 编辑

2011年12月27日 #

       自从上一次写关于ORM的文章已经是几个月前的事情了,在这里先贴一下文章的地址,如果大家感兴趣的话可以去看看。

1)、支持差异数据保存的数据库实体类设计——处女作

2)、支持差异数据保存的数据库实体类设计(二)(续)

3)、支持差异数据保存的数据库实体类设计(三)(续)

4)、SAS框架问世(本文)

       一直在埋头完善框架,博文自然就写得少了,今天来展示一下自己的框架的用法,先说说本框架的有哪些优点:

1)、支持多数据库的ORM。不仅仅只是一套支持多种数据库的ORM,而是可以在同一个应用程序中连接到多个不同的数据库(数据库类别,或者数据库连接字符串的不同)

2)、实体类工具生成

3)、IOC依赖注入

4)、AOP面向方面编程

5)、日志功能

6)、数据库对象审计跟踪功能(包括数据库的历史修改版本查看,数据恢复等功能)

7、权限管理(包括功能模块权限、角色权限、数据组权限等)

8、其他...

       本文主要讲讲ORM的常见用法,首先需要实例化一个数据层代理对象,该对象是一个全局对象,代码如下:      

DalAgent dalAgent= new DalAgent();//实例化一个数据层代理类

IDbHelperFactory dbFalctory = new MSSqlDbHelperFactory("Server=.\SQLEXPRESS;DataBase=SAS;uid=sa;pwd=123456");//实例化数据库帮助类工厂类

dalAgent.GetDbHelperHandler = dbFactory.CreateDbHelper() ;//为数据层代理类设置获取数据库帮助类委托 

注:其中IDbHelperFactory对象的实例可以通过框架中的IOC容器获取。

 

 

       1、查询操作

             List<Entity> list = dalAgent.GetListAll<Entity>(tableName);//根据表名获取全部对象的列表数据;

             List<Entity> list = dalAgent.GetListObject<Entity>(tableName, "Id > 10 and ...");//根据表名、过滤条件,获取对象列表数据; 

             List<Entity> list = dalAgent.GetListObject<T>(tableName, pageInfo, orderBy);//根据表名、分页对象、排序对象获取对象列表数据(分页功能)

             List<Entity> list = dalAgent.GetListObject<T>(tableName, "Id > 10 and ...", pageInfo, orderBy);//根据表名、过滤条件、分页对象、排序对象获取对象列表数据(分页功能)

             List<Entity> list = dalAgent.GetListObject<Entity>(queryStr, listPara);//根据查询语句、参数列表获取全部对象列表数据;

             List<Entity> list = dalAgent.GetListObject<T>(queryStr, listPara, pageInfo, orderBy);//根据查询语句、参数列表、分页对象、排序对象获取对象列表数据(分页功能)

       2、查询单个对象 

             Entity e = dalAgent.GetObjectById<Entity>(tableName, id);//根据表名、Id获取对象; 

             Entity e = dalAgent.GetObject<Entity>(queryStr, listPara);//根据查询语句、参数列表获取全部对象;

       3、插入操作

            Entity e = new Entity();//实例化一个对象,假设该对象有三个属性Id, Name, Description

            e.Name = "Name";

            e.Description = "Description";

            dalAgent.Save(e);//框架自动生成Sql语句,支持自增Id和非自增Id 

       4、更新操作

            Entity e = dalAgent.GetObjectById<Entity>(tableName, 1);

            e.Name = "Name1";

            dalAgent.Save(e);//框架自动生成Sql语句,并且sql语句中只包含更新过的字段  

       5、删除操作

            Entity e = dalAgent.GetObjectById<Entity>(tableName, 1);

            dalAgent.Delete(e);

上面的功能只是本框架这种ORM模块的调用,其他功能在这里就不一一介绍了,留待后续文章补全。

 

 

 ASP.NET开发技术交流群: 67511751

posted @ 2011-12-27 17:06 Juvy 阅读(1768) 评论(13) 编辑

       自从上一次写关于ORM的文章已经是几个月前的事情了,在这里先贴一下文章的地址,如果大家感兴趣的话可以去看看。

1、支持差异数据保存的数据库实体类设计——处女作

2、支持差异数据保存的数据库实体类设计(二)(续)

3、支持差异数据保存的数据库实体类设计(三)(续)

4、SAS框架问世(本片博客即将登场)

由于一直忙于框架的优化,所以就很少写文章了,本文也是在不断的优化自己的ORM过程中诞生的,好了废话不多说了,下面步入正题。

 

       一直在使用公司内部使用的一个框架,框架的的数据层可以说是两个类,一个Entity类,一个EntityFactory类,这两个类分别是干吗就不多讲了。在不断编码的过程中总是发现在重复的写EntityFactory.Save(e)、EntityFactory.Delete(e)这样的代码,心里就在想可否做一下处理,直接调用Entity.Save(),或者Entity.Delete()这样写起来方便,看起来也很顺眼。

       直到最近在优化自己的框架代码的时候,才发现Entity.Save()是不太合适的,特别是当你的应用程序需要连接到多个不同的数据库的时候,而且你也不知道当前这个Entity对应于哪个数据库,或者说同一个Entity对应于多个数据库的时候,使用Entity.Save()操作估计就很难办了。

       假设:MSSqlDAL是Sql Server数据库的数据层,在保存实体对象的时候,你可以通过下面方法完成(Entity e)

  1. MSSqlDAL.Save(e);
  2. 或者你在Entity中增加一个方法public void Save(){ MSSqlDAL.Save(this);},然后调用e.Save()。

       两种方法视乎都可以达到效果,但是现在如果我们的系统需要在另外一个数据库存一个副本,即同一个对象会存到两个不同的数据库(可能是SqlServer,也可能是Oracle),这个时候,我们需要增加一个Oracle数据库的数据层OracleDAL.所以如果这个时候来调用e.Save()方法就出现问题了。

 

最后总结一下,最终定下来采用Dal.Save(e)保存对象是正确的,因为强制性给实体对象增加一个Save()方法,似乎有点说不通,因为对象本身并没有保存这个动作。而是由数据层来负责保存数据库实体对象,这也符合OO原则。

 

ASP.NET开发技术交流群: 67511751

 

posted @ 2011-12-27 15:40 Juvy 阅读(77) 评论(1) 编辑

2011年12月12日 #

本文出现的源头还得从DbHelper说起,先来说说这个DbHelper的演化(产生)过程:

(一)、说起DbHelper大家都非常的熟悉了,就是一个数据库操作帮助类,如果说简单的话,几个静态的方法:

1)、public static DataSet ExecNomQuery(parameters....);

2)、public static DataTable ExecNomQuery(parameters....);

3)、public static bool ExecCommand(parameters....);

4)、public static object ExecScalar(parameters....);

5)...

(二)、如果没有特殊要求的话上面4个方法基本上就够用了,但是如果涉及到事务处理等操作,上面这个数据库帮助类就会显得有点力不从心了。也是正是由于如此,自己把原来的静态数据库帮助类进行了修改,全部采用实例成员,采用new的方式来创建DbHelper,用完后采用using方式将对象Dispose掉。程序运行效果也还可以,如果不是非常高负荷的应用,这样的DbHelper基本上都可以应付。

(三)、为了不至于到处出现new DbHelper()的操作,于是就产生了创建DbHelper对象的简单工厂类。

(四)、在不断应用的过程中,需要对数据库帮助类进行扩展,于是原本只支持MSSqlServer数据库的DbHelper又开始不够用了,为了不改变太多原来DbHelper的代码,于是直接从DbHelper中抽象出一个IDbHelper接口出来,将原来的DbHelper改名为MSSqlDbHelper,同时创建了一个支持Oracle数据库的OracleDbHelper,这样就可以根据通过工厂类创建自己需要的数据库帮助类了(MSSqlServer、OracleDbHelper,如果需要的话,可以自己扩展,只需要继承IDbHelper接口即可)。

(五)、为了消除数据库帮助类中的if;else if;分支的个数,于是产生了抽象工厂类IDbHelperFactory,先通过反射创建IDbHelperFactory,然后通过工厂类创建IDbHelper。(注:抽象工厂类彻底的消除简单工厂类的if-else if分支)

(六)、后来有一段时间一头钻入Ioc的漩涡中,于是产生了一个想法,想自己写一个Ioc容器,。。。哗啦哗啦。。。经过几天的折腾,一个自己打造的精简版的Ioc容器诞生了,通过构造函数/或者setter方式注入创建IDbHelperFactory,然后创建IDbHelper对象。

(七)、上面的IDbHelper用了一段时间,感觉还不错,但是不知不觉的使用过程中,DbHelper中增加了一个又一个的字段、属性、方法(都是实例成员),导致DbHelper对象不断膨胀,从而使得DbHelper实例化的时候,对内存的开销相比最原始的静态数据库帮助类大了许多,想到自己的Ioc容器创建对象的生命周期中有一种是Pooled类型的,即组件池模式。对于这个组件池模式,在这里好好解释一下(对Ioc有一定研究的人可以飘过),组件池模式,即容器在讲对象创建完以后,同时保存一份对象的引用在自己的Pool中,这样调用方在对象调用完毕之后,GC不会将对象回收掉,因为Pool中还有一个该对象的引用。这样在下一个创建该类对象的调用中,Ioc容器就可以先在Pool中寻找是否有可用的对象,如果有的话,就直接返回Pool中的对象,否则重新创建对象。好,问题产生了:

1)、Ioc容器如何判断哪些对象已经不在使用中;

2)、调用方在什么时候释放掉从容器中获取到的对象实例。

基于以上两点,我们可以参考微软自带的数据库连接池功能,即使用的时候,将对象标记为使用中(Status=Open),使用完毕后,将数据库连接对象Close掉,以便其他地方调用。于是一个简单的接口产生了,命名为“可重用对象”:

 

1 public interface IReusedObject
2 {
3     bool IsOnUsing{get;set;}
4 }

 

该接口只有一个bool类型的状态属性:IsOnUsing,用于标记该对象是否处于使用中状态。

下面给出从对象池中获取对象的代码构架:

 

//全局变量,对象池
IList<IReusedObject > _ListInstance;
//对象池线程安全锁
object _Lock;
//对象池容量
int _Capacity;

public IocContainer()
{
    this._ListInstance = new List<IReusedObject >();
    this._Lock = new object();
    //默认设置组件池容量为10,也可以通过其他方式来修改容量
    this._Capacity = 10
}

public object GetInstance(Type t,....)
{
    IReusedObject retValue;
    lock(this._Lock)
    {
        foreach(IReusedObject obj in this._ListInstance)
        {
            if(!obj.IsOnUsing)
            {
                retValue = obj;
                break;
            }
        }
        if(retValue != null)
        {
            retValue.IsOnUsing = true;
            return retValue;
        }
        //如果容器的的容量还为超过指定容量大小,则可以重新创建对象实例。
        if(this._ListInstance.Count < this._Capacity)
        {
            //通过类型创建该类型的对象实例
            
//该方法由容器辅助方法完成,在这里就省略了
            retValue = CreateInstance(t);
            retValue.IsOnUsing = true;
            this._ListInstance.Add(retValue);
            return retValue;
        }
        //否则递归调用方法再次从容器中获取对象实例
        else
        {
             //这就是那经典的0.001秒         
            Thread.Sleep(1);
            return this.GetInstance(t,....);
        }
    }
}

 

写完上述方法后心中窃喜了一阵子,于是迫不及待的创建了30(只要大于组件池的容量即可)个线程来测,结果还没等我反应过来,就发现代码出现了死循环程序提示内存溢出了。。。。

着实让我悲剧了一阵子。。。。。。。。。。。。实在不知道为什么会出现这样的问题,难道是:

【先声明:我测试的对象就是上面的IDbHelper,DbHelper继承了IDispose和IReusedObject两个接口,并且在Dispose方法中加了“IsOnUsing = false;",所以通过using(IDbhelper dbHelper = ....){.....}的方式调用DbHelper对象使用完毕后,对象都会被对象池重用。】

1)、组件池中的所有的对象都一直被占用在。。。。。

2)、还是什么其他原因。。。。

答案已经给出:就在代码中红色标识处。

 

经过大家的激烈讨论,发现有一个地方可以优化的:那就是如果调用方忘记经从Ioc容器中获取的对象Dispose()掉的话,那么这个对象就是个死角,永远也不会被释放掉,直到程序退出为止。所以下一步会针对这个Ioc容器进行优化,为组件池中的组件增加对象超时时间(即对象空闲一段时间就将该对象从组件池中释放掉)。


下面贴出优化后的代码,欢迎大家指正,谢谢!

public override object GetInstance()
{
    IReusedObject retValue = null;
    DateTime now;
    //累计循环次数
    int count = 3;
    //循环因子
    int i = 0;
    //先到组件池中查找可用的对象
    lock (this._Lock)
    {
        while (true && i++ < count)
        {
            now = DateTime.Now;
            //先从组件池中获取对象
            retValue = this._ListInstance.Find(obj => !obj.IsOnUsing);
            //如果能够获取到,则直接返回
            if (retValue != null)
            {
#if DEBUG
Common.InnerLogHelper.WriteLog("Get instance from pool by PooledIocType[Current Count = " + this.InstanceCount.ToString() + "].""SAS.Utilities.IOC.IocType.GetInstance()");
#endif
                retValue.LastVisitTime = now;
                retValue.IsOnUsing = true;
                break;
            }
            //否则,如果组件池的还没装满,则重新创建对象实例,并放入组件池中
            else if (this._ListInstance.Count < this.Capacity)
            {
                retValue = base.CreateInstance() as IReusedObject;
                if (retValue == null)
                {
                    throw new Exception("Type[" + base.Type.FullName + "] must implement from IReusedObject interfact.");
                }
                else
                {
#if DEBUG
Common.InnerLogHelper.WriteLog("Create a new instance by PooledIocType[Current Count = " + this.InstanceCount.ToString() + "].""SAS.Utilities.IOC.IocType.GetInstance()");
#endif
                    this._ListInstance.Add(retValue);
                    break;
                }
            }
            //否则移除组件池中超时的对象,然后进入下一次循环
            else
            {
                //移除超时对象
                this._ListInstance.RemoveAll(obj => obj.LastVisitTime.AddMilliseconds(obj.TimeOut) < now);
                Thread.Sleep(10);
                continue;
            }
        }
    }
    if (retValue == null)
    {
        throw new Exception("Get obj from pool timeout.");
    }
    return retValue;
}

 

 

ASP.NET开发技术交流群: 67511751(人员招募中...)

posted @ 2011-12-12 23:04 Juvy 阅读(5245) 评论(49) 编辑

2011年11月11日 #

本来本文只是本人在百度知道上面的一个提问,但是由于百度知道太恶心了,半天没人给出合适答案,然后自己想回答问题,却发现字数居然限制那么死,所以把那个问题搬家到这里了。

 

问题的意思包括两次创建对象:
1、反射创建对象;
2、利用反射创建的对象来创建对象;
其中第二层次的创建对象可以又会有两种:
a)、new的方式构造对象
b)、反射创建对象
请问在第二层次的new方式创建对象和直接用new方式(即跳过第一层反射操作)创建对象在性能上面又多大的差异?

 

一直没能够等到我需要的答案,只有自己写代码测试了,测试方法还是采用傻瓜式1w,10w,100w,1000w,1ww执行,然后比较执行时间的方式。

最后发现

1、new一个对象是最快的;

2、通过反射方式创建一个ObjectFactory,然后通过ObjectFactory来new一个Object的速度跟直接new的速度差不多;

3、直接用反射的效率是最低的

 

至于为什么呢,我在这里也给一个简单的个人见解:


1、其实new的第一次速度也有些慢,但是经过第一次new操作后(dll的与该对象相关的信息都被加载到内存中了)所有new操作是最快的,因为每次都是从缓存中读取;

 2、反射创建对象,是每次都需要去读取dll文件的,然后解析dll文件创建对象,这里解析就是反射的意思

3、先反射一个ObjectFactory对象,然后通过ObjectFactory方法创建对象,这个的效果跟第一种差不多,因为在反射创建ObjectFactory的时候,把要创建的对象的相关信息加载到内存中,然后从内存中读取dll信息,然后创建对象。

 

上一张本人的测试结果图片

 

ASP.NET开发技术交流群: 67511751(人员招募中...)

 

posted @ 2011-11-11 13:41 Juvy 阅读(95) 评论(2) 编辑

2011年11月3日 #

摘要: 关于数据类型转换类,我想博客园中的99%的人都写过,不论你用什么编程语言,都应该涉及到数据类型转换,这里我说说我的一些想法,各位如果觉得合适的就采纳,觉得不屑一顾的可以飘过,拍砖的稍微轻一点。先申明一下,本文讲到的数据类型转换,主要指的是.net自带的简单数据类型之间的转换, 如object, string, bool, DateTime, int ,long, double等之间的转换。1、强制转换(XXX)obj,其中obj为要进行数据转换的对象,XXX为数据转换的目标数据类型。 优点:当obj是XXX类型的时候,我觉得转换的性能和效率还是很高的。 缺点:当obj不是XXX类型的时候,..阅读全文
posted @ 2011-11-03 19:24 Juvy 阅读(1437) 评论(9) 编辑

摘要: 自从上次写过几篇自主开发的ORM的的文章后,一直都没有更新博客了,但是完善ORM的工作一直都没有丢下,下面来就来一张框架的更新日志的图片吧:ASP.NET开发技术交流群: 67511751(人员招募中...)阅读全文
posted @ 2011-11-03 18:54 Juvy 阅读(73) 评论(1) 编辑

2011年10月18日 #

摘要: 本文为网上摘抄,原文链接:http://developer.51cto.com/art/200908/144084.htmC#Windows服务程序的快速开发:在很多应用中需要做windows服务来操作数据库等操作,比如(1)一些非常慢的数据库操作,不想一次性去做,想慢慢的通过服务定时去做,比如定时为数据库备份等(2)在.net Remoting中利用windows服务来做Host利用vs.net我们可以在几分钟之内建立其windows服务,非常简单下面说一下C#Windows服务程序的快速开发的步骤C#Windows服务程序的快速开发1. 新建一个项目C#Windows服务程序的快速开发2.阅读全文
posted @ 2011-10-18 12:31 Juvy 阅读(80) 评论(0) 编辑

2011年8月31日 #

摘要: 下面就来介绍一些查询的示例:1。Linq查询var racers = from r in Formula1.GetChampions()where r.Wins > 15 && (r.Country == "Brazil" || r.Country == "Austria") select r;foreach (var r in racers){Responose.Write("{0:A}", r);}使用扩展方法的查询并不是所有的查询都可以用LINQ查询完成。也不是所有的扩展方法都映射到LINQ查询子句上。高级阅读全文
posted @ 2011-08-31 16:03 Juvy 阅读(50) 评论(0) 编辑

摘要: 一·前言Linq 英文全称Language Integrated Query,它提供了C#编程语言中的查询语法,可以使用相同的语法访问不同的数据源。并且Linq还提供了不同数据源的抽象层,所以可以使用相同的语法。本次笔记的主要内容如下:● 用List<T>在对象上执行传统查询● 扩展方法● λ表达式● LINQ 查询● 标准查询操作符● 表达式树● LINQ 提供程序一。用List<T>在对象上执行传统查询首先我们来看一个最简单的例子,请看下面的代码: List<string> strList = new List<string>();阅读全文
posted @ 2011-08-31 16:02 Juvy 阅读(39) 评论(0) 编辑

2011年8月30日 #

摘要: 由于项目需要,最近一直在研究SqlServer2005数据库如何迁移到Oracle(10g)中,这里小结一下研究过程中碰到的一些问题(主要分客户端和服务器)1、服务器:1.1 操作系统:Window Server 2003.(安装好后设置计算机名:Server_Name)1.2 安装Oracle10g服务器端(10201_database_win32.zip,文件大小640M左右),安装过程中全部采用默认设置,并且在安装过程的时候顺便安装默认数据库(数据库名orcl),这样系统会自动安装服务监听相关东西(默认监听端口为1521),否则的话,自己配起来很麻烦,在安装数据库的时候有一点需要注意的是阅读全文
posted @ 2011-08-30 10:38 Juvy 阅读(52) 评论(0) 编辑

摘要: 1、在Sql Server2005中建立连接oracle的数据库链接,链接名称=ORCL1;a)链接服务器:写上链接服务器的名字,如:Orcl1b) 服务器类型,选择其他数据源c) 访问接口:选择 Microsoft OLE DB Provider for Oracled) 产品名称:写上 Oraclee) 数据源:写上tnsnames.ora 文件中配置的服务名,如:orcl1_devs_s2f)访问接口字符串:MSDAORAg)在选择安全性选项页,使用此安装上下文建立连接: 1:远程登录:用户名 2:使用密码:密码h) 确定g)直接在Sql Server2005中写查询语句:select 阅读全文
posted @ 2011-08-30 10:37 Juvy 阅读(58) 评论(0) 编辑

2011年8月26日 #

摘要: 为了提高代码的执行效率,我们经常采用对象静态化的方法。但是在使用静态对象的时候,特别是一个公共类, 类名为TestClass: 1、程序员A需要一个静态对象,于是在公共类中添加了一句代码public StaticObjectA A = new StaticObjectA(); 2、程序员B需要一个静态对象,于是在公共类中添加了一句代码public StaticObjectB B = new StaticObjectB();....N、程序员N需要一个静态对象,于是在公共类中添加了一句代码public StaticObjectN N= new StaticObjectN);1publicTest阅读全文
posted @ 2011-08-26 17:03 Juvy 阅读(1426) 评论(3) 编辑

摘要: Request.Url: {http://localhost/itp/OnlineUser.aspx}属性名属性值类型AbsolutePath/itp/OnlineUser.aspxstringAbsoluteUrihttp://localhost/itp/OnlineUser.aspxstringAuthoritylocalhoststringDnsSafeHostlocalhoststringFragment stringHostlocalhoststringHostNameTypeDnsSystem.UriHostNameTypeIsAbsoluteUriTRUEboolIsDefaul阅读全文
posted @ 2011-08-26 13:33 Juvy 阅读(46) 评论(0) 编辑

2011年8月25日 #

摘要: 查询用户jobselect *--job,last_date,last_sec,next_sec,total_time,interval,whatfrom user_jobs--新建jobdeclare jobno number;begindbms_job.submit(jobno, 'TELVENT.GMS_PROCESS_QUEUE;',SYSDATE, 'SYSDATE+2/1440');commit;end; --运行jobbegindbms_job.run(235);end;--移除jobbegindbms_job.remove(235);end;阅读全文
posted @ 2011-08-25 15:20 Juvy 阅读(14) 评论(0) 编辑

2011年8月16日 #

摘要: 答:不需要。原因很简单:SqlDataAdapter.Fill()方法内部对Connection做了检查,如果Connection为关闭状态,会帮忙打开。代码就不在这里贴出来了,有.net reflector工具的人应该都能够找到。ASP.NET开发技术交流群: 67511751(人员招募中...)阅读全文
posted @ 2011-08-16 11:31 Juvy 阅读(67) 评论(0) 编辑

2011年8月14日 #

摘要: Action表示接受0个或多个输入参数,执行一段代码,但是没有任何返回值; Func表示接受0个或多个输入参数,执行一段代码,同时有返回值; Predicate表示定义一组条件并判断参数是否符合条件;阅读全文
posted @ 2011-08-14 13:37 Juvy 阅读(31) 评论(0) 编辑

2011年8月12日 #

摘要: ORACLE数据库安装起来比较麻烦,卸载也不像微软的产品那样容易。对于ORACLE9的卸载,控制面板里是没有卸载程序的。可以从开始菜单—程序—Oracle Installation Products—Universal Installer 进入安装的界面,界面上有一个卸载安装产品,进入菜单,进行卸载操作。不要认为这样就完了。其实反安装程序一点都不智能,大部分东西都还在机器上呢。接下来你要关闭WINDOWS上的ORACLE相关服务。然后删除ORACLE相关的目录。再到注册表中把ORACLE相关的东西都要删除掉,包括 HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE,和HKEY阅读全文
posted @ 2011-08-12 12:58 Juvy 阅读(1324) 评论(5) 编辑

2011年7月24日 #

摘要: 一直处于纠结的边缘,左右不是,不知何去何从,想写点东西,有不知道写点什么,总是手高眼底,想一大通,做的极少,最终总是浑浑噩噩的锅,什么也没完成。今天受到路过秋天大哥的鼓励,才让我继续我之前未完成的文章些列,在这里先谢过。在这篇文章主要讲述数据库实体基类对象ObjBase的构建,首先来一张图片,该图片展示了这套数据库实体所需要的所有类结构:FieldType目录:用于存放所有数据库实体属性类型对象(其中FieldTypeBase为实体属性类型基类),里面的具体细节在本系列的第一篇和第二篇文章中都已经讲述过,在这里就不多讲了;DalAgent.cs:该类是一个静态类,主要包含一些对象的数据库操作的阅读全文
posted @ 2011-07-24 19:52 Juvy 阅读(671) 评论(3) 编辑

2011年5月24日 #

摘要: 首先声明一下,小虾的写文章的水平那是相当的两字——很菜!所以碰到看不明白的文字,请大家留言,我会作特别回答。下面直接入正题。自定义数据库实体类测试版已经出炉(编程语言为C#),支持差异数据保存,0反射,几乎是0查询语句,效率在一定程度上也是很客观的,但是还没有跟原始的DataTable数据绑定进行对比,这个工作留着下一步完成,先说本文重点。1、支持差异数据保存如果想做到这一点, 大家最容易想到的就是添加一个标记,用于记录当前属性的值是否被修改过。先上一段传统的数据库实体类的设计方法:publicclassEntity{publicintIntValue{get;set;}publicintSt阅读全文
posted @ 2011-05-24 11:47 Juvy 阅读(302) 评论(4) 编辑

2011年5月23日 #

摘要: 面向对象开发过程中大家经常碰到的一个东东——数据实体。在实体对象实例的某一个信息被修改后,面临一个数据保存的问题,网上可以搜索到很多不同的保存方法,这里提供小虾(本人)曾经用过的几种常用方法:根据需要,将修改过的属性组合成SQL语句(未修改的属性不作处理),然后执行数据库命令保存数据;提前写好实体对象的SQL语句,如string sql = "UPDATE TableName SET ColumnName1 = {0}, ColumnName2 = {1}, ... WHERE PK_ColumnName = {N}",然后将整个实体对象作为参数传入,将保存实体对象的SQL阅读全文
posted @ 2011-05-23 17:37 Juvy 阅读(398) 评论(11) 编辑

QQ:1054930154; Email:david.telvent@gmail.com; QQ群:67511751