自己动手写轻量级ORM(C#)
最近在看反射,突然想写一个ORM工具,要轻量级的,不要配置文档,先不管效率,就是一个小工具,在项目初期方便挂数据库。
我的目标就是在数据库中建个表,在项目中写个模型,然后用上这个ORM工具,就能实现数据库的基本增删改查。
有想法就动手做,翠花上代码:
增
public bool Insert(object entity) { Type t = entity.GetType(); PropertyInfo[] properties = t.GetProperties(); if (properties.Count<PropertyInfo>() > 1) //至少两个字段,一个主键,一个数据字段。 { string sql = "Insert into " + t.Name; //约定:类名即为数据表名。 string fieldList = ""; string fieldVals = ""; foreach (PropertyInfo field in properties) { if (field.Name.CompareTo("Id") == 0) //约定:字段名若为Id,必为主键,且自动增长。 continue; switch (field.PropertyType.Name) //约定:属性名即为数据字段名。 { case "String": case "DateTime": fieldList += field.Name + ","; fieldVals += "'" + field.GetValue(entity, null) + "',"; break; case "Int32": case "Double": fieldList += field.Name + ","; fieldVals += field.GetValue(entity, null) + ","; break; case "Boolean": fieldList += field.Name + ","; fieldVals += ((bool)field.GetValue(entity, null) ? 1 : 0) + ","; break; default: break; } } fieldList = fieldList.Remove(fieldList.Length - 1); fieldVals = fieldVals.Remove(fieldVals.Length - 1); sql += "(" + fieldList + ") values (" + fieldVals + ")"; return db.ExecuteSql(sql); } else //"出错,没有字段被组合!" return false; }
改
public bool Modify(object entity) { Type t = entity.GetType(); PropertyInfo[] properties = t.GetProperties(); if (properties.Count<PropertyInfo>() > 1) //至少两个字段,一个主键,一个数据字段。 { string sql = "Update " + t.Name + " set "; //约定:类名即为数据表名。 string fieldSet = ""; string fieldCondition = ""; bool firstEntry = true; foreach (PropertyInfo field in properties) { if (firstEntry) //约定:第一个字段为主键。 { if (field.PropertyType.Name.StartsWith("Int")) fieldCondition += field.Name + "=" + field.GetValue(entity, null); else fieldCondition += field.Name + "='" + field.GetValue(entity, null) + "'"; firstEntry = false; } else switch (field.PropertyType.Name) //约定:属性名即为数据字段名。 { case "String": case "DateTime": fieldSet += field.Name + "='" + field.GetValue(entity, null) + "',"; break; case "Int32": case "Double": fieldSet += field.Name + "=" + field.GetValue(entity, null) + ","; break; case "Boolean": fieldSet += field.Name + "=" + ((bool)field.GetValue(entity, null) ? 1 : 0) + ","; break; default: break; } } fieldSet = fieldSet.Remove(fieldSet.Length - 1); sql += fieldSet + " where " + fieldCondition; return db.ExecuteSql(sql); } else //"出错,没有字段被组合!" return false; }
删
public bool Delete(object entity) { Type t = entity.GetType(); PropertyInfo[] properties = t.GetProperties(); if (properties.Count<PropertyInfo>() > 0) { string sql = "Delete From " + t.Name + " where "; string fieldCondition = ""; if (properties[0].PropertyType.Name.StartsWith("Int")) fieldCondition += properties[0].Name + "=" + properties[0].GetValue(entity, null); else fieldCondition += properties[0].Name + "='" + properties[0].GetValue(entity, null) + "'"; sql += fieldCondition; return db.ExecuteSql(sql); } else return false; }
查
public bool Select(object entity) { Type t = entity.GetType(); PropertyInfo[] properties = t.GetProperties(); if (properties.Count<PropertyInfo>() > 1) //至少两个字段,一个主键,一个数据字段。 { string sql = "Select "; //约定:类名即为数据表名。 string fieldList = ""; string fieldCondition = ""; bool firstEntry = true; foreach (PropertyInfo field in properties) { if (firstEntry) //约定:第一个字段为主键。 { if (field.PropertyType.Name.StartsWith("Int")) fieldCondition += field.Name + "=" + field.GetValue(entity, null); else fieldCondition += field.Name + "='" + field.GetValue(entity, null) + "'"; firstEntry = false; } else switch (field.PropertyType.Name) //约定:属性名即为数据字段名。 { case "String": case "DateTime": fieldList += field.Name + ","; break; case "Int32": case "Double": fieldList += field.Name + ","; break; case "Boolean": fieldList += field.Name + ","; break; default: break; } } fieldList = fieldList.Remove(fieldList.Length - 1); sql += fieldList + " from " + t.Name + " where " + fieldCondition; var rs = db.getResult(sql); if (rs.Count > 0) { int index = 1; foreach (var al in rs) { switch (properties[index].PropertyType.Name) //约定:属性名即为数据字段名。 { case "String": properties[index].SetValue(entity, al, null); break; case "DateTime": properties[index].SetValue(entity, DateTime.Parse(al.ToString()), null); break; case "Int32": properties[index].SetValue(entity, Int32.Parse(al.ToString()), null); break; case "Double": properties[index].SetValue(entity, Double.Parse(al.ToString()), null); break; case "Boolean": properties[index].SetValue(entity, Boolean.Parse(al.ToString()), null); break; default: break; } index++; } return true; } else return false; } else //"出错,没有字段被组合!" return false; }
上面的代码实现了最基本的单条纪录的增删改查,其中最麻烦的是查,最简单的是删。
其中的db变量是数据库操作对象,这个大家都熟悉,我就不贴代码了,上面的代码提供思路供大家参考,若哪位兄弟需要代码,请到下面链接去下载,保证能正常运行,例子中给的是MYSQL的操作方法。
下载链接:http://download.csdn.net/detail/ztk12/4975759
MySql.Data.dll 这个动态链接库被我从项目中移除了,大家如果机子上没有的话,自己去下一个吧。