自已动手做一个最简版的Nhibernate

最近动手做一个项目,结果项目延期了,自己分析一下,大部分的时间花在了与项目中数据的持久化那一块了,觉得自己有点吃亏,原因是自己对Nhiberate不太熟,经常出错,
并且,一个很小的项目,所有的东西加起来都不到1M,却因为引用了Nhibernate,加上Nhiberante必须用的几个DLLL很整个工程变得很大,觉得有点过分,所以想来想去,就决定做一个自己版的Nhiberate,这是第一个版本的代码,刚刚写出来,

其中的东西,都集中在了静态类里了,还在要类中实现自己的load,update,insert,delete语句,使用有点麻烦,不过好在自己心里清楚, 用得放心,调试的舒心. 

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Data;
using System.Collections;

namespace learn.MyReflector
...{
   public class Task
    ...{

       private int m_id;
       private DateTime m_arrtime;
       private string m_name;

       public int Id ...{ get ...{ return m_id; } set ...{ m_id = value; } }
       public DateTime ArrTime ...{ get ...{ return m_arrtime; } set ...{ m_arrtime = value; } }
       public string Name ...{ get ...{ return m_name; } set ...{ m_name = value; } }

       public string connstr;//数据库的连接字符串

       public override string ToString()
       ...{
           return "learn.MyReflector.Task";
       }

       public void Load()
       ...{
           SqlConnection con = new SqlConnection(connstr);  
           string[] tpcls = this.ToString().Split('.');
           Array.Reverse(tpcls);
           string tablename = tpcls[0];
           DataRow dr=null;  
           List<string> provalue = new List<string>();

           ArrayList ar = new ArrayList();
           object[] arvalue = null;
           try
           ...{
               SqlCommand com = new SqlCommand();
               com.Connection = con;
               com.CommandText ="select * from "+tablename+" where id='"+Id.ToString()+"'";
               SqlDataAdapter sda=new SqlDataAdapter();
               sda.SelectCommand=com;
               DataSet ds=new DataSet();
               sda.Fill(ds);
               DataTable dt=ds.Tables[0];
               

               if (dt.Rows.Count > 0)
                   dr = dt.Rows[0];
               else
                   return;

               for (int i = 0; i < dt.Columns.Count; i++)
                   ar.Add(dr[i]);

               arvalue=new object[ar.Count];
               ar.CopyTo(arvalue);
               MyReflectorTest.SetValue(ToString(), this, arvalue);

          //   MyReflectorTest.SetValue(ToString(), this, provalue);
 
           }
           catch (Exception ex)
           ...{
               MessageBox.Show(ex.Message);
           }
           finally ...{ con.Close(); }
       }

       public void Create()
       ...{
           SqlConnection con = new SqlConnection(connstr);
           try
           ...{

               SqlCommand com = new SqlCommand();
               com.Connection = con;
               com.CommandText = MyReflector.MyReflectorTest.GetInserSql(this.ToString(), this);
               if (con.State == ConnectionState.Closed)
                   con.Open();
               this.Id = Convert.ToInt32(com.ExecuteScalar());
           }
           catch (Exception ex)
           ...{
               MessageBox.Show(ex.Message);
           }
           finally ...{ con.Close(); }
       }

       public void Update()
       ...{
           SqlConnection con = new SqlConnection(connstr);
           try
           ...{

               SqlCommand com = new SqlCommand();
               com.Connection = con;
               com.CommandText = MyReflector.MyReflectorTest.GetUpdateSql(this.ToString(), this);
               if (con.State == ConnectionState.Closed)
                   con.Open();
               this.Id = Convert.ToInt32(com.ExecuteScalar());
           }
           catch (Exception ex)
           ...{
               MessageBox.Show(ex.Message);
           }
           finally ...{ con.Close(); }
       }

    }



    public static  class MyReflectorTest
    ...{
        public static void Start(
            string clsname, object tarobj,
            List<string> proName,
             List<string> proValue)
        ...{
            Assembly asm = Assembly.GetExecutingAssembly();
            System.Type tasktype = asm.GetType(clsname);

            PropertyInfo[] proinfo = tasktype.GetProperties();

            foreach (PropertyInfo pi in proinfo)
            ...{
                proName.Add(pi.Name);
                //System.Console.WriteLine(pi.Name);
                //System.Console.WriteLine(pi.PropertyType.ToString());
                proValue.Add(pi.GetValue(tarobj, new object[] ...{ }).ToString());
            }

        }


        public static string GetInserSql(string clsname, object tarobj)
        ...{
            string[] tpcls = clsname.Split('.');
            Array.Reverse(tpcls);
            string tablename = tpcls[0];
            StringBuilder sb = new StringBuilder();
            sb.Append("insert into "+tablename+"(");
            List<string> proName = new List<string>(); //属性名
            List<string> provalue = new List<string>() ;//属性值
            Start(clsname, tarobj,proName,  provalue);

            int idpos = 0;//id在返回的字符串中的位置
            StringBuilder sb2 = new StringBuilder();

            for (int i = 0; i < proName.Count; i++)
            ...{
                if (proName[i].ToLower() != "id")
                    sb2.Append(proName[i] + ",");
                else
                    idpos = i;
            }
            

            sb.Append( sb2.ToString().Substring(0, sb2.ToString().Length - 1)); 
            sb.Append(") values(");


            StringBuilder sb3 = new StringBuilder();
            for (int j = 0; j < provalue.Count; j++)
            ...{
                if (j != idpos)
                    sb3.Append("'" + provalue[j] + "',");
            }
            

           
            sb .Append(sb3.ToString().Substring(0, sb3.ToString().Length - 1));
            sb.Append(");select @@IDENTITY");
            return sb.ToString(); 
        }

        public static string GetUpdateSql(string clsname, object tarobj)
        ...{
            string[] tpcls = clsname.Split('.');
            Array.Reverse(tpcls);
            string tablename = tpcls[0];
            string conditionstr = "";
            StringBuilder sb = new StringBuilder();
            sb.Append("update  " + tablename + " set ");
            List<string> proName = new List<string>(); //属性名
            List<string> provalue = new List<string>();//属性值
            Start(clsname, tarobj, proName, provalue); 

            StringBuilder sb2 = new StringBuilder();
            for (int i = 0; i < proName.Count; i++)
                if (proName[i].ToLower() != "id")
                    sb2.Append(proName[i] + "='" + provalue[i] + "',");
                else
                    conditionstr = " where id='" + provalue[i] + "'";  

            sb.Append(sb2.ToString().Substring(0, sb2.ToString().Length - 1));
            sb.Append(conditionstr); 
            return sb.ToString(); 

        }

        public static string GetDelSql(string clsname, object tarobj)
        ...{

            string[] tpcls = clsname.Split('.');
            Array.Reverse(tpcls);
            string tablename = tpcls[0];
            string conditionstr = "";

            StringBuilder sb = new StringBuilder();
            sb.Append("delete from  " + tablename  );
            List<string> proName = new List<string>(); //属性名
            List<string> provalue = new List<string>();//属性值
            Start(clsname, tarobj, proName, provalue);

           
            for (int i = 0; i < proName.Count; i++)
                if (proName[i].ToLower() == "id")
                    conditionstr = " where id='" + provalue[i] + "'"; 

            
            sb.Append(conditionstr);
            return sb.ToString(); 

        }

        public static string GetCreateTabSql(string clsname, object tarobj)
        ...{
            Hashtable ht = new Hashtable();
            ht.Add("System.Int32"," int ,");
            ht.Add("System.String", " nvarchar(50),");
            ht.Add("System.DateTime", " DateTime ,");
           
            string[] tpcls = clsname.Split('.');
            Array.Reverse(tpcls);
            string tablename = tpcls[0];
           

            StringBuilder sb = new StringBuilder();
            sb.Append("create table  " + tablename + " ( id int identity(1,1),");
            List<string> proName = new List<string>(); //属性名
            List<string> proType = new List<string>();//属性值
            GetProNameAndType(clsname, tarobj, proName, proType);


            StringBuilder sb2 = new StringBuilder();
            for (int i = 0; i < proName.Count; i++)
            ...{
                if (proName[i].ToLower() != "id")
                    sb2.Append(proName[i] + ht[proType[i]] );
            }

            sb.Append(sb2.ToString().Substring(0,sb2.ToString().Length-1)+")");
            return sb.ToString(); 
        }


      /**//*  public static string GetSearchStr()
        {
            string[] tpcls = clsname.Split('.');
            Array.Reverse(tpcls);
            string tablename = tpcls[0];


            StringBuilder sb = new StringBuilder();
            //select * from task where id='9'
            sb.Append("select * from  " + tablename + " where id=''");
            List<string> proName = new List<string>(); //属性名
            List<string> proType = new List<string>();//属性值
            GetProNameAndType(clsname, tarobj, proName, proType);


            StringBuilder sb2 = new StringBuilder();
            for (int i = 0; i < proName.Count; i++)
            {
                if (proName[i].ToLower() != "id")
                    sb2.Append(proName[i] + ht[proType[i]]);
            }

            sb.Append(sb2.ToString().Substring(0, sb2.ToString().Length - 1) + ")");
            return sb.ToString(); 
        }*/


        public static void SetValue(
            string clsname, object tarobj, 
            object[] proValue)
        ...{
            Assembly asm = Assembly.GetExecutingAssembly();
            System.Type tasktype = asm.GetType(clsname);

            PropertyInfo[] proinfo = tasktype.GetProperties();

            int i = 0;
            foreach (PropertyInfo pi in proinfo)
            ...{
                try
                ...{
                    pi.SetValue(tarobj, proValue[i], null);
                    i++;
                }
                catch (Exception ex)
                ...{
                    MessageBox.Show(ex.Message);
                }
            }
        }

        public static void GetProNameAndType(
          string clsname, object tarobj,
          List<string> proName,
           List<string> proType)
        ...{
            Assembly asm = Assembly.GetExecutingAssembly();
            System.Type tasktype = asm.GetType(clsname);

            PropertyInfo[] proinfo = tasktype.GetProperties();

            foreach (PropertyInfo pi in proinfo)
            ...{
                proName.Add(pi.Name);
                proType.Add(pi.PropertyType.ToString()); 
            }

        }


      



    }

}

调用代码

 


            MyReflector.Task mytask = new learn.MyReflector.Task();
            mytask.ArrTime = DateTime.Now;
            mytask.Id = 120;
            mytask.Name = "test";


            //MyReflector.MyReflectorTest tp = new learn.MyReflector.MyReflectorTest();
            //tp.Start(mytask.ToString(), mytask);
            //learn.MyReflector.MyReflectorTest.Start(mytask.ToString(), mytask);
            System.Console.WriteLine
            (
            learn.MyReflector.MyReflectorTest.GetInserSql(mytask.ToString(), mytask)
            );

            System.Console.WriteLine
         (
         learn.MyReflector.MyReflectorTest.GetUpdateSql(mytask.ToString(), mytask)
         );

            System.Console.WriteLine
      (
      learn.MyReflector.MyReflectorTest.GetDelSql(mytask.ToString(), mytask)
      );

            System.Console.WriteLine
     (
     learn.MyReflector.MyReflectorTest.GetCreateTabSql(mytask.ToString(), mytask)
     );



            mytask.connstr = @"server=.cxy2;uid=sa;pwd=cxy;database=test";
            mytask.Create();

            Console.WriteLine(mytask.Id.ToString());


            MyReflector.Task btask = new learn.MyReflector.Task();
            btask.connstr = mytask.connstr;
            btask.Id = mytask.Id;

            btask.ArrTime = DateTime.Parse("2007/07/07 12:56:23");
            btask.Name = "cxy";
            btask.Update();

            MyReflector.Task cc = new learn.MyReflector.Task();
            cc.connstr = btask.connstr;
            cc.Id = 3;
            cc.Load();
            Console.WriteLine(cc.ArrTime.ToString());
            
            string  bb = System.Console.ReadLine();

时间: 2024-12-01 22:00:29

自已动手做一个最简版的Nhibernate的相关文章

自己动手做一个SQL解释器

自己动手做一个SQL解释器在一些小型的应用中,完全没有必要使用大型数据库软件.自己做一个SQL解释器就能用数据库的方式来管理了.这个解释器,能解释常用的SQL命令.你可以自行添加其他功能. <?phpclass DB_text {  var $conn;  var $classname = "db_text";  var $database;  function on_create() {  }  function connect($database_name) {    $th

做一个Windows窗体版的DOS分析器

//////////////////////////////////////////////////////////////////////////////////Author: stardicky ////E-mail: stardicky@hotmail.com ////QQNumber: 9531511 ////CompanyName: Ezone International ////Class: HBS-0308 ////title: 做一个Windows窗体版的DOS分析器 /////

自己动手做一个迷你Linux系统

本文将带领大家构建一个迷你型的Linux 系统.它占用的硬盘空间远小于 16M 字节,但是却包括了 XFree86 的 X Window 窗口系统. 目标 本文要构建的这个迷你型的 Linux 系统只能在一台特定的单机上运行,如果读者朋友们有兴趣的话,在这个系统的基础上加以改进,是可以构建出通用的.可以在大多数常规 PC 机上即插即用的系统来的.但是这已经不在本文的话题之内了,读者朋友们如果有兴趣,可以通过我的电子邮件和我讨论其中的细节问题. 我们的目标 Linux 系统运行在一台普通的 Int

我的U盘会唱歌 你也动手做一个吧

U盘也能像CD一样插入电脑就自动播放,如自动全屏播放Flash或课件等.我们现在要来打造一款一插入电脑就能唱歌的U盘. 1.下载AutoFlash.exe,安装后不用作任何设置.如果要卸载AutoFlash.exe,直接删除就可以了. 2.下载MP3TOEXE的小软件.MP3TOEXE是一款将音乐文件(包括MP3.WMA.MID.WAV等)转换为EXE的小工具软件. 打开MP3TOEXE后,单击"歌曲文件"框后的"选择"按钮,选择一首要转换的MP3文件,再单击&qu

我们公司现在准备做一个wap版的手机商城,有些问题需要帮助,谢谢!

问题描述 我们公司现在准备做一个wap版的手机商城,有些问题需要帮助1.我们打算有vs2005开发.2.能说说具体的项目的搭建过程吗? 解决方案 解决方案二:windowsmobile5.0或者6.0数据库有专门的手机用数据库上网方式有两种cmwap/wapcmwap上网一般是0.005元/kgprs包月20/月解决方案三:yeness的回答好象和我的问题不相关啊.解决方案四:wap跟web实质上没什么区别.输出的语法不同而已.去看看wml教程就OK了.

自己动手写一个java版简单云相册_java

动手写一个java版简单云相册,实现的功能是: 用户可以一次上传一个至多个文件. 用户可以下载其他人上传的图片. 用户可以查看其他所有人的图片. 用户只能删除通过自己IP上传的图片. 用到的技术: 文件上传下载.设计模式.Dom4j.xPath等. 先看下2个页面: 源代码: web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns=

自己动手,结合javascript和dhtml做一个ubb编辑器

dhtml|javascript|ubb    看到chinaASP论坛的abc code editor了吗?是不是觉得很cool? 说真的,刚见到我还以为是用别的什么语言做的控件呢,后来才发现没有那么神秘的.前几天做一个商品bbs,客户要求支持ubb,同时也要做一个编辑器.现在我把做ubb的思路给大家讲一下.    首先遇到的是界面问题,实际上这个很好解决,只是利用td的onmouseover.onmouseout和onmousedown来实现,具体实现方法件下面的代码.    其次就是实现文

《动手玩转Arduino》——10.3 作品35:做一个两区域触摸开关

10.3 作品35:做一个两区域触摸开关 在这个作品中,我们用触摸屏坐标系做出了一个开关.把屏幕垂直地分成两部分,如图10-5所示,左边的区域表示"on",而右边的区域表示"off". Arduino通过比较触摸点的坐标和屏幕两部分的边界来判断触摸屏上哪个区域被触摸了.判断出区域之后,就可以向一个数字输出发送开或关的信号了,不过这个程序只是简单地在串口监视器上显示哪个区域被触摸了,是开了还是关了. 10.3.1 程序 输入并上传下面的程序. // 作品35 - 做一

Coder生涯,又是一个轮回,2年回忆录[超简版]

上次入职是2009-05-25,今天是2011-05-24,合同是2年,你懂的.       一切准备就绪,系统重装了,东西卸载了,硬盘格式化了,东西也收拾好了,明天,你懂的. --PS:不懂得大家顶一顶就懂了.   开始: 还记得我刚入职的第一天,早上领好电脑,刚装了点东西,当天下午,领导就给我安排了工作,照着C/S版本的系统给写一个B/S版本的系统, 附着一份半残的B/S代码给参考,时间是2个星期...... 说明: 公司:业务正处于发展期,以前是Dephi开发的的[C/S],随着B/S流行