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

2024-02-14 19:48

本文主要是介绍自已动手做一个最简版的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();

这篇关于自已动手做一个最简版的Nhibernate的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/709433

相关文章

号称第一本程序员的Agent入门书籍?《大模型应用开发 动手做AI Agent》来了!

这本书一共9章,涉及到基础理论、Agent 框架、Multi-Agent、代码实战等丰富内容,整本书更偏向教程实战,就像书名所说的,相当一部分都是代码教学而非枯燥的理论研究,我认为即使是代码小白,也能跟着步骤一步一步用代码实现一个 Agent! 书中既介绍了 ReAct、LangChain 等经典框架,也涉及了爆火的 AutoGPT、Camel 等,还有 AutoGen、MetaGPT 这样的多

十二、部署自已的企业大模型

基于LangChain+ChatGLM3-13B+minio+Paraformer,其中langchain实现本地知识库微调,chatGlm作为大模型基座,minio作为语音存储库,paraformer作为本地文本与语音识别库。 一、Langchain搭建 使用conda创建一个虚拟环境,基于 Python3.10,并在虚拟环境内安装项目的依赖 conda env list conda

自己动手做一个adb的wifi连接及adb命令的apk

前言 估计搞安卓开发的小伙伴们都放弃了eclipse的开发转战android studio了吧,现在gradle都3.0 buiild都24.0.2了以后 都不再支持2.2及以下的版本了。eclipse的同学快上车。 上面的都不是重点,每当你大清早起来去公司上班,然后打开电脑发现你的usb线没有带,作为一个安卓程序员的你有点尴尬了。 然后你果断的给android studio装上ADB

零Flutter基础,四天完成Flutter简版玩Android客户端开发攻略

身为android开发者,在这几天深深感到flutter容易上手的特性,尤其是dart,稍微了解下基本语法,就能直接写,爽的一批~ 废话少说,先看成果 Day0 环境搭建 环境搭建很简单,就是下个 Flutter SDK,然后设置设置环境变量什么的就差不多了,我这里是按照 Flutter 中文网教程搭建,没遇到问题。附上地址:https://flutterchina.club/get-s

如何配置Tomcat,使得可以不用输入项目名称也可访问自已的网页

在学习web开发时,我们经常使用http://localhost:8080/htmltest这样的地址来访问自己开发的网页来测试。其实,tomcat可以实现只输入http://localhost:8080就可访问指定的网页,实现方法如下: 准备:Eclipse、Tomcat。 1、在D盘创建一个文件夹:D:\myweb,该文件夹在第2步中将会用到; 2、在Eclipse中配置Tomcat

Rocky 9 安装 pysam 极简版

一键安装: pip install pysam 事情如果如此简单也就不用写这个博客了。 使用的Anaconda,本来想就着原来的环境,结果GG了。遂新建环境一枚。 mamba的安装在我另一篇博客。 conda create -n pysam python=3.10 ipykernelconda activate pysammamba install -c conda-forge libstdc

[js高手之路]html5 canvas动画教程 - 自己动手做一个类似windows的画图软件

这个绘图工具,我还没有做完,不过已经实现了总架构,以及常见的简易图形绘制功能: 1,可以绘制直线,圆,矩形,正多边形【已完成】 2,填充颜色和描边颜色的选择【已完成】 3,描边和填充功能的选择【已完成】 后续版本: 橡皮擦,坐标系,线形设置,箭头,其他流程图形,裁剪与调整图形。。。。。 终极目标: 流程绘制软件 我是之前看见一位朋友在我的博客中留言说: 非常感谢这个朋友,今天

下决心!学点前端图形开发来提升自已

前端图形开发已成为Web开发绕不开的部分。提升自己前端图形开发能力,才能快点在岗位中突围。但一看到各大实战教程的学习路径就犯难了。 内容不少,感觉学到老也跳不出来啊。还是走回老路?搞个热门国外开源框架应付算了。 我简单通过对图形系统概述 和 进阶前言 进行阅读。在对比了多个学习资源后,我发现“图形开发学院”的图形开发实战教程与传统的图形开发课程有着显著的区别。 发现该教程是一种与传统学习理论和

在github上创建(上传、关联)自已的项目

目录 创建一个github项目并进行开发。 1.github创建空项目 2. git clone 项目 3. 将项目关联 创建一个github项目并进行开发。 1.github创建空项目 右边的New 然后按步创建就行 2. git clone 项目 复制这个连接 然后在终端:git clone [刚才复制的连接] 3. 将项目关联 创建一个自己的项目

MVC下NHibernate使用介绍,配置及CRUD

IT豆豆 2017-04-24 10:39 本练习演示了NHibernate的基础知识,并展示了如何将NHibernate集成到.Net和MVC环境中,并提供了一个示例性的CRUD应用程序。 NHibernate简介 NHibernate是.NET框架的开源对象关系映射技术。它提供了将域模型(类)映射到传统关系数据库并生成查询所需的框架。关于NHibernate http://nhi