`

手把手教你写ORM(八)

阅读更多
最后我们来解决点遗留问题
首先是读取Attribute的问题
Type tp = target.GetType();
PropertyInfo pp 
= tp.GetProperty(s);
foreach (object o in pp.GetCustomAttributes(false))
{
    
if (o.GetType().Equals(typeof(ParamAttribute)))
    
{
        ParamAttribute p 
= (ParamAttribute)o;
        
//这里P就是Attribute的对象啦
        break;
    }

}

大致的方法就是这样子。

还有就是如何通过“NChar”等字符串获取System.Data.SqlDBType这个枚举的类型的值
其实也不难,
SqlDbType ptype = (SqlDbType)System.Enum.Parse(typeof(SqlDbType), "VarChar");
这样子就可以了

最后我们实现一个数据库操作组件就可以把上面内容组合起来了,下面贴的代码是我自己写了个很粗糙的例子上的
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Reflection;
using Alexander.Xbase.ClassConfig;
using Alexander.Xbase.Xcache;
using Alexander.Xbase.Xresource;
using Alexander.Xbase.Interface;

namespace Alexander.Xbase.SqlExec
{
    
public class Exec: Alexander.Xbase.Interface.IQueriable
    
{

        
private string ConnectionString;
        
private SqlConnection conn;
        
private SqlTransaction tran;
        
private bool TransOpen;
        
private string configpath;
        
IQueriable 成员#region IQueriable 成员

        
public void Init(string connstr,string configbase)
        
{
            ConnectionString 
= connstr;
            configpath 
= configbase;
            conn 
= new SqlConnection(ConnectionString);
            
if (conn.State.Equals(ConnectionState.Closed))
            
{
                conn.Open();
            }

            
            
//throw new Exception("The method or operation is not implemented.");
        }


        
public void OpenTranscation()
        
{
            TransOpen 
= true;
            tran 
= conn.BeginTransaction();
           
// throw new Exception("The method or operation is not implemented.");
        }


        
public void Commit()
        
{
            TransOpen 
= false;
            tran.Commit();
            tran 
= null;
            
//throw new Exception("The method or operation is not implemented.");
        }


        
public void RollBack()
        
{
            TransOpen 
= false;
            tran.Rollback();
            tran 
= null;
            
//throw new Exception("The method or operation is not implemented.");
        }


        
public object Query4Object(string action, object target)
        
{
            
object rs=new object();
            ConfigStruct config 
= new ConfigStruct(new Resource(configpath + target.GetType().Name+".xml").Data);
            
string sql = config.GetSql(action);
            
string execsql = MakeExecuteSql(sql);
            
string storedsql = MakeValueSql(sql,target);
            
string sKey = target.GetType().Name + ":" + storedsql;
            
if (config.IsCache(action))
            
{
                
if (IsInCache(sKey, rs))
                
{
                    
return ObjCache.GetObject[sKey];
                }

            }

            SqlCommand comm 
= new SqlCommand(execsql, conn);
            PrepareCommand(comm, execsql, target);
            SqlDataReader sr 
= comm.ExecuteReader();
            
while (sr.Read())
            
{
                rs
=FillObject(sr, target.GetType());
            }

            sr.Close();
            
if (config.IsCache(action))
                ObjCache.Insert(sKey, rs);
            
return rs;
            
//throw new Exception("The method or operation is not implemented.");
        }


        
public void Query4List(string action,ref IList target, object queryparam)
        
{
            
object rs=new object();
            
//SortedList sl = new SortedList();
            ConfigStruct config = new ConfigStruct(new Resource(configpath + queryparam.GetType().Name + ".xml").Data);
            
string sql = config.GetSql(action);
            
string execsql = MakeExecuteSql(sql);
            
string storedsql = MakeValueSql(sql,queryparam);
            
string sKey = queryparam.GetType().Name + ":" + storedsql;
            
if (config.IsCache(action))
            
{
                
if (IsInCache(sKey, rs))
                
{
                    target 
= (IList)ObjCache.GetObject[sKey];
                    
return;
                }

            }

            SqlCommand comm 
= new SqlCommand(execsql, conn);
            PrepareCommand(comm, sql, queryparam);
           
            SqlDataReader sr 
= comm.ExecuteReader();
            
int i=0;
            
while (sr.Read())
            
{
                rs
=FillObject(sr, queryparam.GetType());
                target.Add(rs);
            }

            sr.Close();
            
if (config.IsCache(action))
            
{
                ObjCache.Insert(sKey, target);
            }

            
//return sl;
            
//throw new Exception("The method or operation is not implemented.");
        }


        
public int Query4Page(string action,ref IList target, object queryparam, int pageid, int pagesize,string sort,string direct)
        
{
            
object rs = new object();
            
            ConfigStruct config 
= new ConfigStruct(new Resource(configpath + queryparam.GetType().Name+".xml").Data);
            
string sql = config.GetSql(action);
            
string pagesql = DoPageSql(sql, pageid, pagesize, sort, direct);
            
string execsql = MakeExecuteSql(pagesql);
            
string storedsql = MakeValueSql(pagesql, queryparam);
            
string sKey = queryparam.GetType().Name + ":" + storedsql;
            
int count = (int)Count(action,DoCountSql(MakeExecuteSql(sql)), queryparam);
            
if (config.IsCache(action))
            
{
                
if (IsInCache(sKey, rs))
                
{
                    target 
= (IList)ObjCache.GetObject[sKey];
                    
return count;
                }

            }

            SqlCommand comm 
= new SqlCommand(execsql, conn);
            PrepareCommand(comm, sql, queryparam);
           
            SqlDataReader sr 
= comm.ExecuteReader();
            
int i = 0;
            
while (sr.Read())
            
{
                rs
=FillObject(sr, queryparam.GetType());
                target.Add(rs);
            }

            sr.Close();
            
if (config.IsCache(action))
            
{
                ObjCache.Insert(sKey, target);
            }
     
            
return count;
            
//throw new Exception("The method or operation is not implemented.");
        }


        
public int Query4Update(string action, object target)
        
{
            
object rs = new object();
            ConfigStruct config 
= new ConfigStruct(new Resource(configpath + target.GetType().Name + ".xml").Data);
            
string sql = config.GetSql(action);
            
string execsql = MakeExecuteSql(sql);
            
string storedsql = MakeValueSql(sql, target);
            
string sKey = target.GetType().Name + ":" + storedsql;
            SqlCommand comm 
= new SqlCommand(execsql, conn);
            PrepareCommand(comm, sql, target);
            
int ct=comm.ExecuteNonQuery();
            ObjCache.Flash(target.GetType().Name);
            
return ct;
            
//throw new Exception("The method or operation is not implemented.");
        }


        
public object Query4Count(string action, object target)
        
{
            ConfigStruct config 
= new ConfigStruct(new Resource(configpath + target.GetType().Name + ".xml").Data);
            
string sql = config.GetSql(action);
            
return Count(action,sql, target);
        }

        
public void Close()
        
{
            conn.Close();
            
//throw new Exception("The method or operation is not implemented.");
        }


        
#endregion


        
private string DoPageSql(String command, int pageid, int pagesize, string sor
分享到:
评论

相关推荐

    手写ORM框架笔记.txt

    手写ORM框架笔记

    手写orm

    NULL 博文链接:https://fangyong2006.iteye.com/blog/746016

    手写ORM框架.java

    博文资源

    一个简单的JavaORM框架寂寞消遣之作可供学习参考只有几百行代码。

    一个简单的Java ORM框架,如果你是新手,对MVC框架的实现感兴趣的话,可以看看,一共也就几个类非常简单。

    自己写的orm辅助类

    自己写的orm辅助类 .定义实体的特性(如对应的表名 主键名 属性对应的列名 实体和数据库对象的相互转换 简单实体的 CRUD操作 QQ交流群60168829 欢迎C# ASP.NET 和SQL新手 老手 高手加入 谢谢

    自己写的ORM

    自己写的ORM,看看大家给几分

    手写ORM框架

    这是一个手写的ORM框架,类似于Mybaties框架,可以对数据库进行建表、增、删、查、改操作,每个功能都重载了多种方法,以满足用户需求。此外,还有缓存功能,第二次进行同样的查找操作时将不会调用数据库,而是在...

    Java8应用封装,手写ORM,LOG,framework

    ##公用资源 ###敏捷第一,提供丰富语法糖,方法化,片段化 #####手写容器 #####手写ORM #####手写Log #####自动化配置 #####常用工具类 #####大量回调处理

    Python 手写ORM-我的一个数据库访问工具

    ORM所生成的代码一般不太可能写出很高效的算法,在数据库应用上更有可能会被误用,主要体现在对持久对象的提取和和数据的加工处理上,如果用上了ORM,程序员很有可能将全部的数据提取到内存对象中,然后再进行过滤和...

    自写的access orm框架

    自己写的操作ACCESS 数据库的orm框架,支持添加、修改、删除、分页查询等,方便快捷

    .NET ORM架构源码

    基于ORM模式开发的.NET框架,可在框架内自由添加想要的功能

    手写简易版ORM框架(仿mybatis)

    自己手写的一个半自动框架,里面有运行例子,部分代码从mybatis中抽出

    自己动手写轻量级ORM(C#)

    最近在看反射,突然想写一个ORM工具,要轻量级的,不要配置文档,先不管效率,就是一个小工具,在项目初期方便挂数据库。 我的目标就是在数据库中建个表,在项目中写个模型,然后用上这个ORM工具,就能实现数据库的...

    ORM框架ORM框架ORM框架ORM框架

    能实现基本的数据库操作能实现基本的数据库操作

    Flunet ORM 教程3

    轻量级.Net ORM FluentData教程,分为三个压缩包,下载时请注意! 1fluentdata ORM .7z 2fluentdata ORM.7z 3fluentdata ORM.7z

    Flunet ORM 教程2

    轻量级.Net ORM FluentData教程,分为三个压缩包,下载时请注意! 1fluentdata ORM .7z 2fluentdata ORM.7z 3fluentdata ORM.7z

    一个自己写的ORM原理的映射实例

    一个自己写的ORM映射实例,他是ORM映射的彻底的底层实现,真正的ORM映射的原理

    c# DB操作ORM框架

    .NET ORM框架,基于Dapper效率高,包括根据条件Update,Delete有修改字段,各种单表查寻,操作简单。 支持分库,简单分页,暂不支持分表(想办法支持中,有头续的可以联系)。联系:else-love@qq.com

    自个写的.NET ORM带例子VS2010

    自个写的.NET ORM带例子VS2010

    ORM思想的深入学习ORM.zip

    这里面包括了Hibernate和MyBatis的实现ORM思想的原理,以及讲解了什么是ORM思想。仿照Hibernate自定义了一个简单的增删改查的ORM框架,还有测试代码。

Global site tag (gtag.js) - Google Analytics