自己动手写轻量级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 这个动态链接库被我从项目中移除了,大家如果机子上没有的话,自己去下一个吧。

posted @ 2013-01-09 00:05  zhoutk  阅读(4729)  评论(15编辑  收藏  举报