原创最简单的ORM例子
这个仅是为了培训做的一个小例子
public class DB {
public static string GetClassName(Type type)
{
if (type == null)
throw new ArgumentException("参数type不能为空");
else{
if (type.HasAttribute<DBTableNameAttribute>())
return type.GetAttribute<DBTableNameAttribute>().Name;
else
return type.Name;
}
}
public static T AddObject<T>(T o) where T :class
{
string tablename = GetClassName(typeof(T));
string fieldName;
object fieldValue;
string[] fieldNames;
object[] fieldValues;
System.Reflection.PropertyInfo[] Props = typeof(T).GetProperties();
fieldNames=new string[Props.Length ];
fieldValues =new object [Props.Length ];
string checkstr = "";
for (int i = 0; i < Props.Length; i++)
{
fieldName = Props[i].Name;
fieldValue = Props[i].GetValue(o, null);
if (fieldValue == null) continue;
fieldValue = CommonFunction.SafeSQL(fieldValue.ToString());
fieldNames[i] = fieldName;
fieldValues[i] = fieldValue;
object[] attributes = Props[i].GetCustomAttributes(false);
foreach (Attribute a in attributes)
{
//判断Attribute 中是否 为 UniqueColumnAttribute
if (a is UniqueColumnAttribute)
{
checkstr = "not exists(select * from " +tablename + " where " + fieldName + "='" + fieldValue + "')";
}
}
}
if (checkstr != "")
{
checkstr = "if("+checkstr +")";
}
string insert = "" ,tail="";
insert = "insert into " + tablename + " (";
tail = "values(";
for (int i = 0; i < Props.Length; i++)
{
fieldName = fieldNames[i] ;
if (fieldName.ToUpper() == "ID") continue;
object _fieldValue = fieldValues[i];
if (_fieldValue == null)
{ }
else
{
insert += fieldName + ",";
tail += "'" + _fieldValue + "',";
}
}
insert = insert.Remove(insert.Length - 1);
tail = tail.Remove(tail.Length - 1);
string insertstr = insert + ")" + " " + tail + ")";
if (checkstr != "")
insertstr = checkstr +"begin "+ insertstr+" end";
insertstr+=" select @@identity"
SqlHelper link = new SqlHelper();
int r= link.UpdateDataBase(insertstr);
if(r>0) {
o.Id=r;
return o;
}
return null;
}
public static bool DelObject<T>( int id) where T : class
{
if (id == 0) return false;
string tablename = GetClassName(typeof(T));
string insert = "";
insert =string.Format( "delete from {0} where id={1}",tablename,id)
SqlHelper link = new SqlHelper();
int r = link.UpdateDataBase(insert);
return true;
}
public static bool DelObject<T>(T o) where T : class
{
string tablename = GetClassName(typeof(T));
string fieldName;
object fieldValue;
string[] fieldNames;
object[] fieldValues;
System.Reflection.PropertyInfo[] Props = typeof(T).GetProperties();
fieldNames = new string[Props.Length];
fieldValues = new object[Props.Length];
for (int i = 0; i < Props.Length; i++)
{
fieldName = Props[i].Name;
fieldValue = Props[i].GetValue(o, null);
fieldNames[i] = fieldName;
fieldValues[i] = fieldValue;
}
string str="";
for (int i = 0; i < Props.Length; i++)
{
fieldName = fieldNames[i];
string _fieldValue = fieldValues[i].ToString();
if (fieldName.ToUpper() == "ID")
{
str = "delete from " + tablename + " where id=" + _fieldValue ;
break;
}
}
if(!string.IsNullOrEmpty(str))
{
SqlHelper link = new SqlHelper();
int r = link.UpdateDataBase(str);
return true;
}
return false;
}
public static bool UpdateObject<T>(T o) where T : class
{
string tablename = GetClassName(typeof(T));
string fieldName;
object fieldValue;
string[] fieldNames;
object[] fieldValues;
System.Reflection.PropertyInfo[] Props = typeof(T).GetProperties();
fieldNames = new string[Props.Length];
fieldValues = new object[Props.Length];
for (int i = 0; i < Props.Length; i++)
{
if (Props[i].DeclaringType.IsValueType)
{
fieldName = Props[i].Name;
fieldValue = Props[i].GetValue(o, null);
fieldNames[i] = fieldName;
fieldValues[i] = fieldValue;
}
else
{
fieldNames[i] = null;
fieldValues[i] = null;
}
}
string str = "update "+tablename +" set ",where=" where id=";
int id = 0;
for (int i = 0; i < Props.Length; i++)
{
fieldName = fieldNames[i];
object _fieldValue = fieldValues[i] ;
if (fieldName == null) continue;
if (fieldName.ToUpper() == "ID")
{
if (_fieldValue == null)
{
}
else
{
int.TryParse(_fieldValue.ToString(), out id);
//str = "delete from " + tablename + " where id=" + _fieldValue;
where += id.ToString();
}
//break;
}
else
{
if (_fieldValue == null)
{
}
else
str += fieldName + "='" + _fieldValue.ToString() + "',";
}
}
if (id <= 0) return false;
str = str.Remove(str.Length - 1);
str += where;
SqlHelper link = new SqlHelper();
int r = link.UpdateDataBase(str);
return true;
}
public static T SelObject<T>(int id) where T : class
{
if (id <= 0) return null ;
string tablename = GetClassName(typeof(T));
string insert = "";
insert = "select * from " + tablename + " where id=" + id.ToString();
SqlHelper link = new SqlHelper();
DataTable dt = link.SelectDataBase(insert);
if (dt == null || dt.Rows.Count == 0) return null;
Type type = typeof(T);
Object obj = type.Assembly.CreateInstance(type.FullName);
System.Reflection.PropertyInfo[] Props = typeof(T).GetProperties();
for (int i = 0; i < Props.Length; i++)
{
Props[i].SetValue(obj, dt.Rows[0][Props[i].Name], null);
}
return (T)obj;
}
public static T SelObject<T>(BaseQuery query ) where T : class
{
if (query==null )
return null;
string tablename = GetClassName(typeof(T));
if (tablename.EndsWith("Query"))
tablename = tablename.Replace("Query","");
string fieldName;
object fieldValue;
string[] fieldNames;
object[] fieldValues;
System.Reflection.PropertyInfo[] Props = query.GetType().GetProperties();
fieldNames = new string[Props.Length];
fieldValues = new object[Props.Length];
for (int i = 0; i < Props.Length; i++)
{
fieldName = Props[i].Name;
fieldValue = Props[i].GetValue(query, null);
fieldNames[i] = fieldName;
fieldValues[i] = fieldValue;
}
string insert = "",where="1=1";
insert = "select * from " + tablename + " where " ;
int id = 0;
for (int i = 0; i < Props.Length; i++)
{
fieldName = fieldNames[i];
object _fieldValue = fieldValues[i];
if (fieldName.ToUpper() == "ID")
{
if (_fieldValue == null)
{ }
else
{
int.TryParse(_fieldValue.ToString(), out id);
//str = "delete from " + tablename + " where id=" + _fieldValue;
where +="Id="+ id.ToString();
}
//break;
}
else
{
if (_fieldValue == null)
{ }
else
{
if (string.IsNullOrEmpty(_fieldValue.ToString()))
{ }
else
where += " and " + fieldName + "='" + _fieldValue.ToString() + "'";
}
}
}
insert = insert + where;
SqlHelper link = new SqlHelper();
DataTable dt = link.SelectDataBase(insert);
if (dt == null || dt.Rows.Count == 0) return null;
Type type = typeof(T);
Object obj = type.Assembly.CreateInstance(type.FullName );
System.Reflection.PropertyInfo[] Props2 = typeof(T).GetProperties();
for (int i = 0; i < Props2.Length; i++)
{
Props2[i].SetValue(obj, dt.Rows[0][Props2[i].Name], null);
}
return (T)obj;
}
public static T SelObject<T>(string where) where T : class
{
if (string.IsNullOrEmpty(where)) ) return null;
string tablename = GetClassName(typeof(T));
string insert = "";
insert = "select * from " + tablename + " where " + where;
SqlHelper link = new SqlHelper();
DataTable dt = link.SelectDataBase(insert);
if (dt == null || dt.Rows.Count == 0) return null;
Type type = typeof(T);
Object obj = type.Assembly.CreateInstance(type.FullName);
System.Reflection.PropertyInfo[] Props = typeof(T).GetProperties();
for (int i = 0; i < Props.Length; i++)
{
Props[i].SetValue(obj, dt.Rows[0][Props[i].Name], null);
}
return (T)obj;
}
public static List<T> ListObjects<T>(string where) where T : class
{
try
{
if (string.IsNullOrEmpty(where))
where = "1=1";
string tablename = GetClassName(typeof(T));
string insert = "";
insert = "select * from " + tablename + " where " + where;
SqlHelper link = new SqlHelper();
DataTable dt = link.SelectDataBase(insert);
if (dt == null || dt.Rows.Count == 0) return null;
Type type = typeof(T);
List<T> list = new List<T>();
for (int row = 0; row < dt.Rows.Count; row++)
{
Object obj = type.Assembly.CreateInstance(type.FullName );
System.Reflection.PropertyInfo[] Props = typeof(T).GetProperties();
for (int i = 0; i < Props.Length; i++)
{
Props[i].SetValue(obj, dt.Rows[row][Props[i].Name], null);
}
list.Add((T)obj);
}
return list;
}
catch
{
return null;
}
}
}
原创最简单的ORM例子的更多相关文章
- D2010 RTTI + Attribute 简单实现ORM
还记得David I 今年四月来盛大时,被问及“反射机制能再做得好一点吗?我们想放弃RTTI”,David I 回答“这的确是需要考虑的地方,当然RTTI我们不会放弃的”.(这个白胡子的老哥哥还真很可 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51007512 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...
- 一个简单的CORBA例子
因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...
- 菜鸟学习Hibernate——简单的一个例子
一.Hibernate开发. 上篇博客已经为大家介绍了持久层框架的发展流程,持久层框架的种类. 为了能够使用Hibernate快速上手,我们先讲解一个简单的Hibernate应用实例hibernate ...
- 一个简单的ORM制作(SQL帮助类)
一个简单的ORM制作大概需要以下几个类: SQL执行类 CURD操作类 其他酱油类 先从SQL执行类说起,可能会涉及数据库的迁移等问题,所以需要定义一个接口以方便迁移到其他数据库, 事务没提供命名,若 ...
- 轻松创建nodejs服务器(1):一个简单nodejs服务器例子
这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world ...
- C#基础笔记---浅谈XML读取以及简单的ORM实现
背景: 在开发ASP.NETMVC4 项目中,虽然web.config配置满足了大部分需求,不过对于某些特定业务,我们有时候需要添加新的配置文件来记录配置信息,那么XML文件配置无疑是我们选择的一个方 ...
- 使用Multiplayer Networking做一个简单的多人游戏例子-3/3(Unity3D开发之二十七)
使用Multiplayer Networking做一个简单的多人游戏例子-1/3 使用Multiplayer Networking做一个简单的多人游戏例子-2/3 使用Multiplayer Netw ...
随机推荐
- DLL丢失修复
DLL丢失修复,简答傻瓜式! DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用.本程序为绿色版,无需安装,可直接运行. 本程序的主要功能是检测当前系统的Dir ...
- 委托(delegate)
委托(dekegate)是一种动态调用方法的类型,与类.接口和数组相同,属于引用型,可以用来实现多路广播(MulticastDelegate). 多路广播(MulticastDelegate):可以用 ...
- Hibernate的三种状态
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Objec ...
- hive中行转换成列
python代码 #!/bin/bashimport sys; if __name__=='__main__': for line in sys.stdin: m=line.strip().split ...
- 自定义View完全解析
自定义View主要包括以下3种方式: 一.组合控件,利用已有控件的组合,来满足自己的需求. 例子:顶部导航栏 二.继承已有View,比如继承TextView.ImageView等,根据需要重写相应的方 ...
- Java面试知识的认知描述
连接池:同时操作连接数据库,创建一个连接池,池子里创建一万个数据库链接.根据系统运行情况关闭链接.高峰期链接达到最大MAX进行排队,对在用的链接实现失效时间.有几种:tomcat请求服务器(serve ...
- 【bzoj2242】 SDOI2011—计算器
http://www.lydsy.com/JudgeOnline/problem.php?id=2242 (题目链接) 题意 给出y,z,p.求:1.yz mod p:2.xy=z(mod p):3. ...
- BZOJ4719 [Noip2016]天天爱跑步
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- android下载简单工具类
功能是实现下载文件,图片或MP3等,为了简单起见使用单线程,此代码为MarsAndroid教程的复制品,放在此处,留着参考. 首先是一个得到字节流随后保存到内存卡上的工具类: package com. ...
- Genymotion关于【启动后player.exe已停止运行】解决方案总结
1. 你硬盘空间不足,或是暂存区不够,请少执行一些程序或关掉一些p2p的程序,或是到控制面板卸载一些不必要的程序.最好的建议是定期进行硬盘清理,确保不浪费多余空间 ---以上来源(http://www ...